【问题标题】:Can I create windows on different threads with FLTK 1.3?我可以使用 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 

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

【问题讨论】:

    标签: multithreading fltk


    【解决方案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 源代码树的目录。如果没有,请下载。

    【讨论】:

      【解决方案2】:

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

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

      同时,绘图仪线程使用

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

      而不是

      Fl::run();
      

      轮询 APC 请求。

      【讨论】:

        猜你喜欢
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多