不能在多线程中操作gtk控件

⌚Time: 2025-01-19 21:01:00

👨‍💻Author: Jack Ge

我尝试在多线程中进行文件扫描操作,并且在扫描过程中使用回调函数的办法来实时更新gtk控件数据的显示。

但是经常会发生各种崩溃和错误。我怀疑是使用了多线程的问题。以前我使用多线程操作cpp模板库一样的不安全。

问了inscode ai才知道gtk控件不能在多线程中操作,这是它的原话:

跟大多数GUI工具包一样,GTK+是单线程的,也就是说GTK+的所有操作必须在主线程中进行。因此,在多线程中操作GTK+控件是不安全的。如果需要在多线程中更新GTK+控件,你可以使用glib库提供的g_idle_add()函数来运行更新操作的回调函数。这个函数会在主线程中以安全的方式执行指定的函数。

如果在gtk中我使用密集计算的地方通常会阻塞运行,导致界面卡死无响应。但是不一定需要使用多线程,而可以使用下面的代码主动刷新主界面操作

while(gtk_events_pending()){
    gtk_main_iteration();
}

我愿称之为“神奇代码”。

我的使用场景是点击开始按钮后,在回调函数中进行一些文件扫描操作。同时对于文件进行处理。只需要在这个文件处理函数中加上这样一句就可以了。它会让主界面继续响应用户的操作。

//密集计算的代码
while(1){
    //代码
    ...

    while(gtk_events_pending()){
        gtk_main_iteration();
    }
}
//递归函数
void function(){
    //代码
    ...
    refresh_ui();

    function();
}
void refresh_ui(){
    while(gtk_events_pending()){
        gtk_main_iteration();
    }
}

这样的意义很大,如果用户在程序大量计算的时候不会导致界面卡住吗,如果点击停止按钮,停止按钮的回调函数代码可以执行。这样扫描过程就可以停止下来。