首页 > 解决方案 > XinitThread 和 libfltk

问题描述

我正在使用带有 FLTK 的接口编译代码,我需要能够派生回调,因为它在点击“运行”时从表单中获取参数启动工作。我不能在函数开始时使用 fork 让一个线程立即返回 UI,据说 XInitThreads() 没有参数运行并且在失败时返回零,任何其他都是成功的。我的检查没有显示 XInitThreads 返回 0,所以这部分工作正常。然而我仍然得到一个错误:

[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
rc: ../../src/xcb_io.c:260: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.

这出现两次,每个启动的线程都有一次。

我断言调用:

if(XInitThreads() == 0)
{
    fprintf(stderr, "Warning ! No forking available.\n");
}

不出现警告。

使用 ubuntu 20.10
g++
FLTK-1.1
ARCH amd64

标签: c++multithreadingfltk

解决方案


//通过使用 sdt::thread.

Fl_Button b;
b.callback(wrapper, data);

void wrapper(Fl_Widget *w, void *v) {
    std::thread th(task, v);
    th.detach();
} 

包装函数启动一个线程,我们不加入回调函数内部,或者根本不加入。


推荐阅读