-1

我目前正在研究声音信号可视化器。得到信号后,我需要在两个不同的窗口上绘制它的波形和频谱。因此我实现了一个 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 

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

4

2 回答 2

1

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

您有两种选择:

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

  2. 在调用Fl::lock()Fl::unlock()调用 FLTK 方法之间。

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

于 2013-10-02T13:20:13.607 回答
0

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

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

同时,绘图仪线程使用

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

代替

Fl::run();

轮询 APC 请求。

于 2013-09-14T21:16:48.597 回答