我尝试在多线程中进行文件扫描操作,并且在扫描过程中使用回调函数的办法来实时更新gtk控件数据的显示。
但是经常会发生各种崩溃和错误。我怀疑是使用了多线程的问题。以前我使用多线程操作cpp模板库一样的不安全。
问了inscode ai才知道gtk控件不能在多线程中操作,这是它的原话:
跟大多数GUI工具包一样,GTK+是单线程的,也就是说GTK+的所有操作必须在主线程中进行。因此,在多线程中操作GTK+控件是不安全的。如果需要在多线程中更新GTK+控件,你可以使用glib库提供的g_idle_add()函数来运行更新操作的回调函数。这个函数会在主线程中以安全的方式执行指定的函数。
如果在gtk中我使用密集计算的地方通常会阻塞运行,导致界面卡死无响应。但是不一定需要使用多线程,而可以使用下面的代码主动刷新主界面操作
我愿称之为“神奇代码”。
我的使用场景是点击开始按钮后,在回调函数中进行一些文件扫描操作。同时对于文件进行处理。只需要在这个文件处理函数中加上这样一句就可以了。它会让主界面继续响应用户的操作。
//递归函数
void function(){
//代码
...
refresh_ui();
function();
}
void refresh_ui(){
while(gtk_events_pending()){
gtk_main_iteration();
}
}这样的意义很大,如果用户在程序大量计算的时候不会导致界面卡住吗,如果点击停止按钮,停止按钮的回调函数代码可以执行。这样扫描过程就可以停止下来。