glib:在另一个线程上处理自定义GMainContext *循环,而不是提升信号处理程序

问题描述 投票:0回答:1

我正在尝试创建一个自定义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()适当地提升信号处理程序。

c++ glib event-loop networkmanager
1个回答
0
投票

我怀疑这是因为至少有一些潜在的libnm GSources仍然被添加到全局默认的GMainContext(总是由g_main_context_default()返回)。如果您打算在另一个线程中运行自定义GMainContext,您需要确保所有GSources都附加到它;或者你还需要在主线程中运行全局默认的GMainContext

如果您尝试在主线程中的一个线程和Qt主循环中运行GMainContext,那么您将不得不考虑两者都触及的数据的线程安全性。从长远来看,将全局默认GMainContext链接到Qt主循环(反之亦然)可能更容易,这样您只能运行一个事件循环(在一个线程中)。那你就不必考虑线程安全了。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.