Странная проблема Qt - перерисовка окна, блокировка потоков?

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


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

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

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

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

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

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам