Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使g_idle_add/g_timeout_add运行的函数异步工作?_C_User Interface_Gtk - Fatal编程技术网

C 如何使g_idle_add/g_timeout_add运行的函数异步工作?

C 如何使g_idle_add/g_timeout_add运行的函数异步工作?,c,user-interface,gtk,C,User Interface,Gtk,由于上面的语句,我感觉GUI响应很慢 如何使其异步工作,从而不影响GUI响应?在主线程中调用这些函数的回调。如果read\u next\u packets速度慢或I/O阻塞,您应该为其创建一个独立的线程,该线程不会干扰GUI。当该线程需要通知主线程某件事情时,它可以使用g\u idle\u add将执行转移到主线程范围 在伪代码中: g_timeout_add (100, (GSourceFunc) read_next_packets, NULL); 你知道如何从主线程调用专用线程中的函数吗?

由于上面的语句,我感觉GUI响应很慢


如何使其异步工作,从而不影响GUI响应?

在主线程中调用这些函数的回调。如果
read\u next\u packets
速度慢或I/O阻塞,您应该为其创建一个独立的线程,该线程不会干扰GUI。当该线程需要通知主线程某件事情时,它可以使用
g\u idle\u add
将执行转移到主线程范围

在伪代码中:

g_timeout_add (100, (GSourceFunc) read_next_packets, NULL);

你知道如何从主线程调用专用线程中的函数吗?你不能直接调用。间接地,您可以建立一个
GAsyncQueue
,并使线程从该队列处理对象。但是,如果您只需要一个线程来读取包,只需在
while()
循环中执行即可。
// In a dedicated thread:
while (...) {
    Package*  package = do_read ();  // This call is slow or blocks.
    if (package)
        g_idle_add ((GSourceFunc) process_package, package);
}

// This is called in the main thread.  Should be fast to not freeze GUI.
gboolean
process_package (Package* package)
{
    ...
    package_free (package);
}