我正在尝试创建一个自定义GMainContext*
(所以不要与Qt / etc冲突)并在自定义线程上处理循环。
我正在使用libnm
(对于NetworkManager),但我不认为它是相关的。
使用自定义GMainContext*
时,不会引发/处理信号处理程序。
#include <NetworkManager.h>
#include <iostream>
#include <thread>
// Uncomment this for it to not work.
#define WORKING
static void test_callback ()
{
std::cerr << "test callback";
}
static int thread(GMainContext *mainContext)
{
GMainLoop* mainLoop = g_main_loop_new(mainContext, FALSE);
g_main_loop_run(mainLoop);
}
int main(int argc, char *argv[])
{
#ifdef WORKING
GMainContext* mainContext = g_main_context_default();
#else
GMainContext* mainContext = g_main_context_new();
g_main_context_push_thread_default(mainContext);
#endif
GError* error = nullptr;
NMClient* client = nm_client_new(nullptr, &error);
g_signal_connect(client, NM_CLIENT_ACTIVE_CONNECTION_ADDED, G_CALLBACK(test_callback), nullptr);
g_signal_connect(client, NM_CLIENT_ACTIVE_CONNECTION_REMOVED, G_CALLBACK(test_callback), nullptr);
std::thread thread_obj(thread, mainContext);
thread_obj.join();
return 0;
}
使用WORKING
定义的g_main_context_default()
适当地提升信号处理程序。
我怀疑这是因为至少有一些潜在的libnm GSource
s仍然被添加到全局默认的GMainContext
(总是由g_main_context_default()
返回)。如果您打算在另一个线程中运行自定义GMainContext
,您需要确保所有GSource
s都附加到它;或者你还需要在主线程中运行全局默认的GMainContext
。
如果您尝试在主线程中的一个线程和Qt主循环中运行GMainContext
,那么您将不得不考虑两者都触及的数据的线程安全性。从长远来看,将全局默认GMainContext
链接到Qt主循环(反之亦然)可能更容易,这样您只能运行一个事件循环(在一个线程中)。那你就不必考虑线程安全了。