2017-06-05 37 views
0

我使用多線程構建了一個代碼,它工作得很好。當我點擊按鈕時,它開始在控制檯中寫入循環,當我再次單擊它時停止。gtk中的多處理c 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()應該僅從main調用,並且您應該使用標誌來控制線程。