我正在尝试创建自定义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
正确引发信号处理程序。
答案 0 :(得分:0)
我怀疑这是因为至少有一些底层libnm GSource
仍被添加到全局默认值GMainContext
(始终由g_main_context_default()
返回的那个)中。如果要在另一个线程中运行自定义GMainContext
,则需要确保所有GSource
都已附加到该线程上;或者您还需要在主线程中运行全局默认值GMainContext
。
如果您试图在一个线程中运行GMainContext
,并在主线程中运行Qt主循环,则您将不得不对两者所涉及的数据的线程安全性进行大量思考。其中。从长远来看,将全局默认值GMainContext
链接到Qt主循环可能会更容易(反之亦然),这样您就只能运行一个事件循环(在一个线程中)。然后,您不必考虑线程安全性。