glib:在另一个线程上处理自定义GMainContext *循环,不引发信号处理程序

时间:2019-05-01 14:08:54

标签: c++ glib event-loop networkmanager

我正在尝试创建自定义library(data.table) setDT(unique(a))[b, on = .(well)] # well area score #1: 222 H 12000 #2: 21 C 10000 #3: 43 D 9000 #4: 64 E 20000 (以免与Qt / etc冲突)并在自定义线程上处理循环。

我正在使用GMainContext*(用于NetworkManager),但我认为这无关紧要。

使用自定义libnm时不会引发/处理信号处理程序。

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正确引发信号处理程序。

1 个答案:

答案 0 :(得分:0)

我怀疑这是因为至少有一些底层libnm GSource仍被添加到全局默认值GMainContext(始终由g_main_context_default()返回的那个)中。如果要在另一个线程中运行自定义GMainContext,则需要确保所有GSource都已附加到该线程上;或者您还需要在主线程中运行全局默认值GMainContext

如果您试图在一个线程中运行GMainContext,并在主线程中运行Qt主循环,则您将不得不对两者所涉及的数据的线程安全性进行大量思考。其中。从长远来看,将全局默认值GMainContext链接到Qt主循环可能会更容易(反之亦然),这样您就只能运行一个事件循环(在一个线程中)。然后,您不必考虑线程安全性。