我可以使用 FLTK 1.3 在不同线程上创建窗口吗?

Posted

技术标签:

【中文标题】我可以使用 FLTK 1.3 在不同线程上创建窗口吗?【英文标题】:Can I create windows on different threads with FLTK 1.3? 【发布时间】:2013-09-14 19:55:00 【问题描述】:

我目前正在开发一个声音信号可视化工具。得到信号后,我需要在两个不同的窗口上绘制它的波形和频谱。因此我实现了一个 Plotter 类,它在构造时为每个实例创建自己的线程。但是现在我遇到了麻烦,因为 FLTK 的许多功能似乎是线程不安全的,因为它在某些类方法调用时崩溃。 (如设置轴刻度)

我现在使用的模型:

Plotter 1 -> ctor() -> create thread
                                     \
Plotter 2 -> ctor() -> create thread----> PlotterThread(Plotter*this) - 
                                     /                                |
Plotter 3 -> ctor() -> create thread                                  |
                                                                      |
                                                     create fltk window and init object 

这个模型是否可行?我现在不知道... 谢谢。

【问题讨论】:

【参考方案1】:

您显然没有阅读 FLTK 文档中关于并发编程的最重要部分:http://www.fltk.org/doc-1.3/advanced.html#advanced_multithreading。请仔细阅读。

你有两种选择:

    使用Fl::awake() 将消息发送到主(gui)线程。主线程可以使用Fl::thread_message() 检查消息并创建您喜欢的任何小部件。

    在对 Fl::lock()Fl::unlock() 的调用之间调用 FLTK 方法。

最后,您在 $FLTK_SRC/test 目录中有一个非常不错的演示,其中 $FLTK_SRC 是您保存 FLTK 源代码树的目录。如果没有,请下载。

【讨论】:

【参考方案2】:

我想出了一个解决这个问题的办法:

只为所有绘图仪创建一个线程(绘图仪线程)。 对于第一个之后的绘图仪,他们使用 QueueUserAPC 向绘图仪线程发布构造调用,因为似乎 FLTK 只允许在主线程中创建 UI 元素。 (绘图仪线程)

同时,绘图仪线程使用

while( Fl::wait() > 0)
    SleepEx( 0, TRUE);

而不是

Fl::run();

轮询 APC 请求。

【讨论】:

以上是关于我可以使用 FLTK 1.3 在不同线程上创建窗口吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fltk 1.3 创建 opengl 3.x 或 4.x 上下文?

fltk 1.3 库中的 graph.h 在哪里?

FLTK 绘图功能使用哪个原点?小部件还是窗口?

FLTK 模态窗口

FLTK 事件映射/多线程

如何使用 Stroustrup 的 Fltk Text 类调用变量?