我有一个将实时动画绘制到 gtkmm 窗口的程序。我有我的主线程 gui 线程和一个使用 cairo 将动画帧渲染到图像表面的工作线程。工作线程每 33 毫秒由主线程发出信号。现在,当必须渲染帧时,我的应用程序会在每次超时时创建一个新的渲染线程。我该如何创建一种线程池,在该线程池中,gui线程中的超时信号通知我的工作线程唤醒并渲染一个帧,该帧向gui线程发出帧已完成的信号,然后返回睡眠并等待再次发出信号。
问问题
829 次
2 回答
1
我不是渲染和 cairo 方面的专家,但线程通常可以相互发出信号。更简单的方法是使用条件变量或互斥锁。您的所有工作线程都可以在互斥锁上等待,GUI 线程可以在超时时释放互斥锁,GUI 线程本身可以在另一个线程上等待。获取互斥体的工作线程可以渲染帧和信号 GUI 线程,然后可以返回到第一个互斥体以等待来自 GUI 线程的下一个信号。
于 2010-06-17T15:21:31.000 回答
0
您可以使用一种master-worker
方法,其中主线程是master
处理要渲染的帧,并且workers
是从pool
工作线程中提取的。
您可以使用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();
}
这是另一个使用示例。
于 2010-06-18T09:42:39.380 回答