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);
}
Gtk函數只能由主線程調用。 –
@BasileStarynkevitch線程似乎沒有任何GTK +調用... – andlabs
@Asha你發佈的代碼工作,你的真實代碼不起作用並不能幫助我們解決你的問題。你能提供一個代碼樣本來產生你的錯誤嗎? – andlabs