唤醒线程信号

时间:2010-06-17 14:06:43

标签: c++ multithreading gtkmm

我有一个编程,它将实时动画绘制到gtkmm窗口。我有我的主线程gui线程和一个使用cairo将动画帧渲染到图像表面的worker threa。工作线程每隔33mS由主线程发出信号。现在,我的应用程序在每个超时都需要渲染一个帧时创建一个新的渲染线程。我怎样才能创建一种线程池,其中gui线程中的超时信号通知我的工作线程唤醒并呈现一个框架,该框架向gui线程发出信号表示框架已完成,然后返回休眠状态并等待再次发出信号。< / p>

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用master-worker方法,其中主线程是master,用于处理要呈现的帧,workerspool工作线程中提取

您可以使用DevGuy提供的公共域thread pool实施。

我认为这样的事情应该有效:

#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();
}

这是另一种用法example