2010-06-17 4 views
0

У меня есть программа, которая рисует анимацию в реальном времени в окне gtkmm. У меня есть основной поток потока gui и рабочий threa, который отображает рамку анимации на поверхность изображения с использованием cairo. Рабочий поток сигнализируется основным потоком каждые 33 мс. Прямо сейчас у меня есть приложение, создающее новый поток рендеринга в каждый тайм-аут, когда кадр должен быть визуализирован. Как я могу начать создание своего рода пула потоков, где в тайм-ауте в потоке gui мой рабочий поток пробуждается и отображает кадр, который сигнализирует о том, что поток gui завершен, а затем возвращается в режим сна и ждет, чтобы его снова сигнализировали.Wake Thread On Signal

ответ

1

Я не эксперт в области рендеринга и каира, но потоки могут в общем сигнализировать друг другу. Более простой способ сделать это - использовать условную переменную или мьютекс. Все ваши рабочие потоки могут ждать mutex, и поток GUI может выпустить mutex вовремя, а сам поток GUI может идти и ждать в другом потоке. Рабочий поток при получении мьютекса может отображать поток кадров и сигналов GUI, а затем может вернуться к первому мьютексу, чтобы ждать следующего сигнала из потока графического интерфейса.

+0

Да, я понял, что сигнал поперечной нити будет лучшим способом. Может быть, Glib :: Dispatcher - это то, что мне нужно, чтобы сделать эту работу – Talguy

0

Вы можете использовать master-worker подход, при котором основной поток является master, который обрабатывает кадры, которые будут отображены и workers извлекаются из pool рабочих потоков.

Доступно с нуля thread pool Доступно с DevGuy, которое вы можете использовать.

Я думаю, что что-то, как это должно работать:

#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.