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