Вопрос запуска QTimer в QGIS (Квантовая ГИС) - PullRequest
1 голос
/ 09 сентября 2009

Я принимал участие в создании приложения QGIS custum, в котором текущие данные должны отображаться в средстве просмотра приложения.

Используемый IPC - это очереди сообщений Unix.

Данные должны обновляться с указанным интервалом, скажем, 3 секунды.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что обработка данных, которые должны быть показаны, занимает более 3 секунд, поэтому я до того, как приложение начнет обрабатывать данные для следующего обновления, обновления QTimer останавливается, и после обработки данных я снова перезапускаю QTimer.Приложение должно работать таким образом, чтобы после обновления / обновления (во время этого обновления приложение перестало отвечать) у пользователя было достаточно времени, чтобы продолжить работу над приложение, кроме просмотра обновляемых данных. Я могу получить приемлемые паузы для пользователя - в одном сценарии.

Но на разных ОС (от RHEL 5.0 до RHEL 5.2) ситуация какая-то другая. Таймер сходит с ума и продолжает срабатывать, не давая пауз ч / б последовательные обновления, таким образом, переходя в бесконечный цикл. Обработка данных этого обновления определенно занимает больше 3 секунд, но по этой же причине я остановил-перезапустил таймер во время обработки .. и та же логика работает в одном сценарии, а в другом - нет .. Другой факт, который я заметил, заключается в том, что при таком быстром срабатывании таймера происходит, время, необходимое функции обновления для выхода, очень мало, примерно 300 мс, так что запуск-остановка таймера, который я поместил в начале и конце этой функции, происходит в это небольшое время ... так что до фактическая обработка данных заканчивается, в очереди 3-4 запуска таймера, ожидающих выполнения, и, таким образом, проблема бесконечного зацикливания усугубляется с этой точки при каждом последующем обновлении.

Здесь важно отметить, что для одного и того же кода в одной ОС время обновления составляет около 4000 мс (фактическое время обработки, необходимое для того же объема данных), а для другой ОС - 300 мс.

Может быть, это как-то связано с более новыми библиотеками на обновленной ОС ... но я не знаю, как отладить это, потому что я не могу понять, почему это происходит как таковое ... возможно, что-то связанное с pthreads изменилось ч / б ОС ??

Итак, мой запрос заключается в том, чтобы каким-либо образом гарантировать, что некоторая обработка в моем приложении будет синхронизирована (и которая не зависит от ОС) без использования QTimer, поскольку я считаю, что QTimer не является хорошим вариантом для достижения того, что я хотите ??

Какой вариант может быть там ?? pthreads или Boost темы? какой из них будет лучше, если я буду использовать потоки в качестве альтернативы? Но как я могу убедиться, что по крайней мере 3-секундный разрыв ч / б последовательных обновлений, независимо от того, сколько времени занимает обработка обновления?

Пожалуйста, помогите.

Спасибо.

1 Ответ

1 голос
/ 10 сентября 2009

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

...