Завершить функцию кнопкой в ​​Qt

У меня есть функция, которая обрабатывает кадры видео по кадрам, и это довольно долго. Поэтому я решил добавить что-то вроде кнопки «Пауза и возобновление», но я не знаю, как завершить выполнение функции с помощью кнопки. Я догадался, что это должно что-то делать с потоком, но я не знаю, как это сделать. Вы можете дать мне какой-то совет?

0

Решение

(Примечание: я называю вашу функцию ProcessFramesOfVideo () просто для упрощения обращения к ней ниже)

Если функция ProcessFramesOfVideo () работает в вашем основном потоке, то, скорее всего, ваш GUI зависает во время выполнения функции, потому что цикл событий GUI не будет работать до тех пор, пока не вернется ProcessFramesOfVideo.

Если это так, то быстрый и грязный способ разморозить ваш графический интерфейс во время работы ProcessFramesOfVideo () будет состоять в том, чтобы периодически вызывать qApp-> processEvents () (например, каждые 50 мс или что-то) из вашего цикла внутри ProcessFramesOfVideo (). Это позволило бы Qt обрабатывать входящие события GUI (например, щелчки мышью) достаточно своевременно, пока обрабатывается видео, например, если пользователь изменяет размер окна во время обработки видео, виджеты изменяют размер, как и ожидалось. После того, как вы это заработаете, нужно просто поместить кнопки «Пауза» и «Возобновить» в графический интерфейс как обычно, и, возможно, заставить их установить логический флаг «please_stop_processing», который также периодически проверяется циклом ProcessFramesOfVideo (); если флаг имеет значение true, ProcessFramesOfVideo () может вернуться рано или т. д.

Если вы ищете более элегантное решение, чем другое, другой вариант — создать QThread и запустить метод ProcessFramesOfVideo () в этом отдельном потоке. Это позволило бы ProcessFramesOfVideo () действительно работать параллельно с циклом событий Qt GUI (особенно на многоядерном процессоре), так что отзывчивость GUI вообще не уменьшалась бы. ProcessFramesOfVideo () все еще может использовать старый метод периодической проверки булева, чтобы знать, следует ли ему приостановить или возобновить свою обработку; но поскольку у вас будет задействовано несколько потоков, вы захотите, чтобы поток GUI заблокировал мьютекс перед записью в логическое значение, а затем разблокировал мьютекс, и вы захотите, чтобы функция ProcessFramesOfVideo () блокировала этот же мьютекс перед чтением логическое, и разблокировать мьютекс впоследствии. Это гарантировало бы, что кэши ЦП и / или оптимизация компилятора не влияют на то, что потоки «видят» изменения друг друга в логическом флаге.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector