Я пытаюсь создать пользовательский 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()
.