2017-06-05 5 views
0

マルチスレッドを使用してコードを作成しましたが、そのまま動作します。ボタンをクリックすると、コンソールにループ書き込みが開始され、もう一度クリックすると停止します。gtkのマルチプロセッシングc

実際のコードを実装しようとすると、エラーが表示されます:error corrupted double linked list

スレッドは同じメモリ空間にあるためだと思います。代わりにプロセスに切り替えることを考えています。ライブラリはありますか?私が見つけることができるのはfork()とexec()なので、私はそれらで何ができるのか分かりません。

したがって、gtkアプリケーションでマルチプロセスを処理するにはどうすればよいですか?

#include <pthread.h> 
#include <gtk/gtk.h> 

int CLICK; 

void* fonc(void* arg){ 
int i; 
while (CLICK==1){ 
    printf("nope \n"); 
    usleep(100000); //wait 
} 
} 

static void cb_clicked(GtkButton *button, gpointer data) 
{ 
pthread_t interface, lancementWhile; //déclaration des deux tâches 
    /* No need to call gdk_threads_enter/gdk_threads_leave, 
     since gtk callbacks are executed withing main lock. */ 
    if (CLICK==0){ 
     CLICK=1; 
     pthread_create(&lancementWhile, NULL, fonc, (void*)NULL); 
     printf("you started \n"); 
     gtk_button_set_label(button, "Clicked"); 

    } 
    else{ 
     CLICK=0; 
     printf("you stoped \n"); 
     gtk_button_set_label(button, "Unclicked"); 
    } 
} 

void *creationInterface(void *arg){ 

    GtkWidget *window; 
    GtkWidget *button; 


    /* Do stuff as usual */ 
    gtk_init(NULL, NULL); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    g_signal_connect(G_OBJECT(window), "destroy", 
         G_CALLBACK(gtk_main_quit), NULL); 

    button = gtk_button_new_with_label("Initial value"); 
    g_signal_connect(G_OBJECT(button), "clicked", 
         G_CALLBACK(cb_clicked), NULL); 
    gtk_container_add(GTK_CONTAINER(window), button); 

    gtk_widget_show_all(window); 

    gtk_main(); 
} 

int main(void) 

{ 
/* Secure glib */ 
    if(! g_thread_supported()) 
     g_thread_init(NULL); 

    /* Secure gtk */ 
    gdk_threads_init(); 

    /* Obtain gtk's global lock */ 
    gdk_threads_enter(); 


    CLICK=0; 
    pthread_t interface; 
    pthread_create(&interface, NULL, creationInterface, NULL); 
    pthread_join(interface, NULL); 


} 
+0

Gtk関数は、メインスレッドだけが呼び出す必要があります。 –

+0

@BasileStarynkevitchスレッドはGTK +の呼び出しを行わないようです... – andlabs

+1

@Ashaあなたが投稿したコードが動作し、あなたの実際のコードがうまくいかないことがあなたの問題を解決するのに役立つものではありません。あなたが持っているエラーを生成するコードサンプルを提供できますか? – andlabs

答えて

1

gtk_main()はメインからのみ呼び出す必要があり、フラグを使用してスレッドを制御する必要があります。

関連する問題