C++ 唤醒线程打开信号

C++ 唤醒线程打开信号,c++,multithreading,gtkmm,C++,Multithreading,Gtkmm,我有一个程序正在绘制实时动画到gtkmm窗口。我有我的主线程gui线程和一个worker threa,它使用cairo将动画帧渲染到图像表面。主线程每隔33毫秒向工作线程发送一次信号。现在,我让我的应用程序在必须渲染帧的每个超时时间创建一个新的渲染线程。我如何创建一种线程池,在gui线程超时时,它向我的工作线程发出信号,让我的工作线程唤醒并渲染一个帧,该帧向gui线程发出信号,该帧已完成,然后返回睡眠状态并等待再次发信号。我不是渲染和CARO方面的专家,但线程通常可以相互发出信号。一种更简单的方

我有一个程序正在绘制实时动画到gtkmm窗口。我有我的主线程gui线程和一个worker threa,它使用cairo将动画帧渲染到图像表面。主线程每隔33毫秒向工作线程发送一次信号。现在,我让我的应用程序在必须渲染帧的每个超时时间创建一个新的渲染线程。我如何创建一种线程池,在gui线程超时时,它向我的工作线程发出信号,让我的工作线程唤醒并渲染一个帧,该帧向gui线程发出信号,该帧已完成,然后返回睡眠状态并等待再次发信号。

我不是渲染和CARO方面的专家,但线程通常可以相互发出信号。一种更简单的方法是使用条件变量或互斥体。所有工作线程都可以在互斥体上等待,GUI线程可以在超时时释放互斥体,GUI线程本身可以在另一个线程上等待。获取互斥体时的工作线程可以呈现帧并向GUI线程发送信号,然后可以返回到第一个互斥体以等待来自GUI线程的下一个信号。

您可以使用
主工作线程方法,其中主线程是处理要渲染的帧的
主线程
,而
辅助线程
是从辅助线程的
中提取的

有一个公共域
线程池
实现可供使用

我认为这样做应该奏效:

#include <dg/dg.h>
#include <dg/thread/threadpool.h>
#include <dg/thread/impl.h>
#include <dg/impl.h>
#include <boost/bind.hpp>

// a mutex is needed if the workers touch shared data
boost::mutex mutex;

struct work
{
    void operator ()()
    {
        boost::mutex::scoped_lock lock(mutex);

        // this is where a worker does its thing
    }

    worker(/* your constructor params */)
    {
        // ...
    }

    worker(const worker &w)
    {
        // ...
    }    

    // internal work data
};

int main(int argc, char* argv[])
{
    // a pool with 5 threads that ca queue up to 100 jobs
    dg::thread::ThreadPool pool(5,100);

    for (;;)
    {
        // create a piece of work
        work w;

        // execute the work
        pool.invoke(w);

        // some exit condition
    }

    // wait for unfinished work
    pool.wait();
}
#包括
#包括
#包括
#包括
#包括
//如果工作人员接触共享数据,则需要互斥
互斥互斥;
结构工程
{
void运算符()()
{
boost::mutex::作用域锁定(mutex);
//这是工人做事的地方
}
worker(/*您的构造函数参数*/)
{
// ...
}
工人(施工工人和工人)
{
// ...
}    
//内部工作数据
};
int main(int argc,char*argv[])
{
//包含5个线程的池,最多可对100个作业进行排队
dg::thread::ThreadPool池(5100);
对于(;;)
{
//创作一件作品
工作w;
//执行工作
调用(w);
//一些退出条件
}
//等待未完成的工作
pool.wait();
}

这是另一种用法。

是的,我认为跨线程信号将是最好的方法。也许我需要Glib::Dispatcher来完成这项工作