интересная проблема синхронизации потоков - PullRequest
0 голосов
/ 20 марта 2011

Я пытаюсь придумать модель синхронизации для следующего сценария:

У меня есть поток графического интерфейса, который отвечает за интенсивную загрузку процессора + блокировку ввода-вывода.Поток графического интерфейса извлекает изображения из сети (помещает их в общий буфер), эти изображения обрабатываются (интенсивная загрузка ЦП .. выполняется рабочим потоком), а затем эти изображения анимируются (опять же интенсивно загружаются ЦП .. потоковой графический интерфейс пользователя)).

Обработка изображений выполняется рабочим потоком. Он извлекает изображения из общего буфера, обрабатывает их и помещает в выходной буфер.

ЦП иПоток GUI не должен планироваться, пока он анимирует изображения (анимация должна быть действительно плавной).Это означает, что рабочий поток должен получать ЦП только тогда, когда поток GUI ожидает завершения операции ввода-вывода.

Как мне добиться этого?Это похоже на классическую потребительскую проблему производителя ... но я не совсем уверен, как я могу гарантировать, что анимация будет максимально плавной (я открыт для использования большего количества потоков).

Я бы хотелиспользуйте QThreads (каркас Qt) для независимости от платформы, но я могу рассмотреть pthreads для большего контроля (поскольку в настоящее время мы стремимся только к Linux).

Любые идеи?

РЕДАКТИРОВАТЬ:

Я предполагаю, что проблемы сводятся к одной вещи ... как я могу гарантировать, что поток анимации не прерывается во время анимации изображений (анимация запускается, когда пользователь переходит с одной страницы на другую ... все изображения вновая страница анимируется, прежде чем показываться в нужном месте. Это небольшая операция, но она должна быть очень плавной.) Рабочий поток может выполняться только после окончания анимации.

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Первый большой вопрос: действительно ли мне нужны темы?Система событий Qt и сетевые объекты упрощают отсутствие технической нагрузки потоков и всех препятствий, которые с этим связаны.

Посмотрите альтернативные способы решения проблем здесь и здесь .Эти методы хороши, если вы придерживаетесь чистого кода Qt и не зависите от сторонней библиотеки.Если вам необходимо использовать стороннюю библиотеку, которая блокирует вызовы, то, конечно, вы можете использовать потоки.

Здесь - пример потребителя-производителя.

Также взгляните на Расширенное программирование на Qt: Создание отличного программного обеспечения на C ++ и Qt 4

Мой совет - начать без потоков и посмотреть, как оно работает.Вы всегда можете рефакторинг для потоков после.Поэтому лучше всего спроектировать ваши объекты / архитектуру без слишком большой связи.

Если вы хотите, вы можете опубликовать некоторый код, чтобы придать больше контекста.

1 голос
/ 20 марта 2011

Просто подумайте вслух, но звучит так, как будто у вас есть две задачи, требующие большого объема вычислений, animation и processing, и вы хотите, чтобы animation всегда имел приоритет над processing. Если это правильно, то, возможно, вместо того, чтобы выполнять эти задачи в отдельных потоках, у вас может быть один поток, который обрабатывает как animation, так и processing.

Например, поток может иметь две очереди задач, одну для animation заданий и одну для processing заданий, и он только начинает задание из очереди processing, когда очередь animation пуста. Но это будет хорошо работать только в том случае, если каждое отдельное processing задание является относительно небольшим и / или прерываемым на произвольных позициях (в противном случае animation задание будет отложено, а это не то, что вам нужно).

...