我可以使用 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 在不同线程上创建窗口吗?的主要内容,如果未能解决你的问题,请参考以下文章