有没有办法将GSocketService附加到非默认(NULL)主循环上下文? A正在搜索API,无法为GSocketService找到任何“附加”功能。也许GSocketService中包含一些较低级别结构的函数,但我不确定在非默认主循环上下文中运行时发出“传入”信号会是怎样的。
答案 0 :(得分:0)
来自GSocketService
Docbook条目:
套接字服务在线程默认上下文的主循环上运行 它创建的线程,并且通常不是线程安全的。 但是,启动和停止服务的调用是线程安全的 这些可以从处理传入客户端的线程中使用。
要更改线程默认上下文,请使用g_main_context_push_thread_default/pop_thread_default
:
g_main_context_push_thread_default ()
void g_main_context_push_thread_default(GMainContext *上下文);获取上下文并将其设置为当前线程的线程默认上下文。这将导致某些异步 在此开始的操作(例如大多数基于gio的I / O) 线程在上下文中运行并将结果传递给它的主要部分 循环,而不是在主要的全局默认上下文中运行 线。请注意,调用此函数会更改返回的上下文 通过g_main_context_get_thread_default(),而不是返回的那个 g_main_context_default(),因此它不会影响使用的上下文 像g_idle_add()。
这样的函数通常在创建新函数后不久会调用此函数 线程,传递一个GMainContext,它将由GMainLoop运行 该线程,为所有异步操作设置新的默认上下文 那个帖子。 (在这种情况下,你不需要打电话 g_main_context_pop_thread_default()。)但在某些情况下,您可以 想要在非默认上下文中安排单个操作,或者 暂时在主线程中使用非默认上下文。在那里面 case,你可以将调用包装在一个异步操作中 g_main_context_push_thread_default()/ g_main_context_pop_thread_default()对,但这取决于你 确保没有其他异步操作意外启动 非默认上下文处于活动状态。
请注意,此功能之前的库可能不正确 处理从具有线程默认上下文的线程使用。例如,见 g_file_supports_thread_contexts()。
上下文:
GMainContext,或全局默认上下文的NULL。 [允许-无] 自2.22以来