Странная проблема Qt - перерисовка окна, блокировка потоков? - PullRequest
1 голос
/ 31 августа 2011

Это x-post моего сообщения на форуме поддержки Qt, так как я подумал, что это странно и интересно, и вы все могли бы помочь мне и здесь.


Я попытаюсь объяснить возникшую у меня проблему - это действительно странная проблема, так что терпите меня, пока я пытаюсь ее объяснить.

Позвольте мне сначала изложить мою заявку. Это простая программа типа «Serial Data Logger», написанная на Qt 4.7 для Windows XP; он в основном получает сообщения через последовательный порт (используя QExtSerialPort), выполняет некоторую обработку для извлечения данных из этих сообщений, а затем передает эти данные во внешний интерфейс GUI и выводит их в файлы журнала. У меня также есть сообщения и данные, поступающие на выход приложения в различных точках с помощью qDebug (), чтобы я мог отслеживать, что происходит внутри приложения.

Для ясности, если вы не использовали его, QExtSerialPort просто испускает сигнал, когда на последовательный порт поступают байты, и передает их в подключенный слот, используя QByteArray.

Так что теперь к моей проблеме - мое приложение изначально работает отлично, но примерно через 5 - 10 минут все блокируется и перестает работать, заставляя меня его аварийно завершить.

Изучив это далее в отладчике, я заметил очень странную вещь.

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

Так что мои ограниченные выводы здесь, кажется, наводят меня на мысль, что, поскольку каждое из этих действий блокирует перерисовку окна, действие GUI / перерисовки должно блокировать входящие мои сообщения.

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

Кто-нибудь видел что-нибудь подобное раньше? У кого-нибудь есть идеи относительно того, что может происходить?

1 Ответ

1 голос
/ 31 августа 2011

Когда вы перетаскиваете окно или открываете QMenu, используется временный QEventLoop, который позволяет вашим приложениям получать события.

Это означает, что вы где-то в своем коде (или QExtSerialPort) препятствует выполнению основного цикла событий.

...