2017-06-05 18 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调用,并且您应该使用标志来控制线程。