glib: Обработка пользовательского цикла GMainContext * в другом потоке без обработки обработчиков сигналов - PullRequest
0 голосов
/ 01 мая 2019

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

1 Ответ

0 голосов
/ 02 мая 2019

Я подозреваю, что это потому, что по крайней мере некоторые из базовых libnm GSource все еще добавляются к глобальному значению по умолчанию GMainContext (тот, который всегда возвращается g_main_context_default()).Если вы собираетесь запустить пользовательский GMainContext в другом потоке, вы должны убедиться, что все GSource подключены к нему;или вам также нужно запустить глобальное значение по умолчанию GMainContext в главном потоке.

Если вы пытаетесь запустить GMainContext в одном потоке и основной цикл Qt в основном потоке, вы собираетесьЯ должен много думать о безопасности потоков данных, которые затронуты ими обоими.В долгосрочной перспективе может быть проще связать глобальное значение по умолчанию GMainContext с главным циклом Qt (или наоборот), чтобы у вас работал только один цикл обработки событий (в одном потоке).Тогда вам не нужно думать о безопасности потоков.

...