У меня есть программа, которая рисует анимацию в реальном времени в окне gtkmm. У меня есть основной поток потока gui и рабочий threa, который отображает рамку анимации на поверхность изображения с использованием cairo. Рабочий поток сигнализируется основным потоком каждые 33 мс. Прямо сейчас у меня есть приложение, создающее новый поток рендеринга в каждый тайм-аут, когда кадр должен быть визуализирован. Как я могу начать создание своего рода пула потоков, где в тайм-ауте в потоке gui мой рабочий поток пробуждается и отображает кадр, который сигнализирует о том, что поток gui завершен, а затем возвращается в режим сна и ждет, чтобы его снова сигнализировали.Wake Thread On Signal
ответ
Я не эксперт в области рендеринга и каира, но потоки могут в общем сигнализировать друг другу. Более простой способ сделать это - использовать условную переменную или мьютекс. Все ваши рабочие потоки могут ждать mutex, и поток GUI может выпустить mutex вовремя, а сам поток GUI может идти и ждать в другом потоке. Рабочий поток при получении мьютекса может отображать поток кадров и сигналов GUI, а затем может вернуться к первому мьютексу, чтобы ждать следующего сигнала из потока графического интерфейса.
Вы можете использовать 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.
- 1. Thread 1 signal SIGABRT
- 2. Java Concurrency wake up thread
- 3. Python Wake On Lan
- 4. zend_auth identity on wake
- 5. Запуск plist on wake
- 6. Xcode: Thread 1 Signal SIGABRT
- 7. Xcode: Thread 1: signal SIGABRT
- 8. java thread wait and auto wake up
- 9. PyQt wake main thread from non-QThread
- 10. Windows thread sleep and wake from another thread
- 11. Django: Signal on queryset.update
- 12. MKCoordinateRegionMakeWithDistance выбрасывает «Thread 1: signal SIGABRT»
- 13. Thread, ansi c signal и Qt
- 14. (Thread: 1 signal SiGARBT) tableView dequeueReusableCellWithIdentifier
- 15. Firebase, вызывающий «Thread 1: signal SIGABRT»
- 16. Segue вызывает ошибку «Thread 1: signal SIGABRT»
- 17. Thread wait for Signal in loop
- 18. Crash with Thread 1: signal SIGABRT
- 19. thread 2/8/9: signal sigabrt error
- 20. Swift 'thread 1 signal sigabrt' Ошибка
- 21. Я получаю эту «Thread 1: signal SIGABRT»
- 22. django signal on user create
- 23. Signal clic on QSpinBox Qt
- 24. Как сделать Wake On Lan для Android?
- 25. Android Wake On Lan в Java
- 26. Wake on lan из браузера через javascript
- 27. Как включить Wake on LAN программно
- 28. Wake On Lan В других сериях IP
- 29. Wake on LAN Скриншот Powershell не работает
- 30. Boost Thread Hanging on _endthreadex
Да, я понял, что сигнал поперечной нити будет лучшим способом. Может быть, Glib :: Dispatcher - это то, что мне нужно, чтобы сделать эту работу – Talguy