Название: Обработка сообщений главным GUI потоком Отправлено: Gorin от Сентябрь 20, 2008, 09:45 Делаю класс на основе Qextserialport c функциональностью асинхронного обмена.
Для опроса количества байт в порту использую поток со msleep(1) (пробовал также с таймером), обработку новых данных произвожу при помощи SIGNAL SLOT (пробовал также с QEvent). Класс работает как надо, но если зажать левую клавишу мыши на верхней части окна (типа перемещение) - то SLOT (а так же и event) перестает обрабатываться главной формой а сваливается в очередь обработки сообщений которая не обрабатывается, пока кнопочку не отпустишь, а для приложения работающего с com портом это недопустимо. В принципе можно посадить таймер на главную форму и в нем опрашивать порт - но это не удобно. для SIGNAL SLOT попробовал Directconnection, для QEvent postevent - результата одинаковый, неудовлетворительный, описанный выше. Подскажите пож-ста как бороться с этой проблемой. Название: Re: Обработка сообщений главным GUI потоком Отправлено: ритт от Сентябрь 20, 2008, 10:45 ммм...перейти на линукс? )
проблема известная и к кутям отношения не имеет - где-то в настройках венды нужно включить какую-то галочку (то ли "Отображать содержимое окна при перетаскивании", то ли ещё что - не помню точно). и, кстати, существует похожая проблема с тяни-бросаем...мастдай, х?ле? Название: Re: Обработка сообщений главным GUI потоком Отправлено: Tonal от Сентябрь 21, 2008, 10:22 2 GorinЭлементарно: обрабатывать данные в дополнительном потоке, а в главный просто слать уведомления (сигналя или события) о том, что очередную порцию можно показывать. :)
Название: Re: Обработка сообщений главным GUI потоком Отправлено: Gorin от Сентябрь 23, 2008, 05:24 Работаю в windows.
Галочка "Отображать содержимое окна при перетаскивании" не помогла = эффект тот же. Буду пробовать по варианту Tonal. ИНтересный момент: при перемещении формы таймер внутри потока приостанавливается и не генерит сообщения. Название: Re: Обработка сообщений главным GUI потоком Отправлено: Alex03 от Сентябрь 23, 2008, 06:30 ИНтересный момент: при перемещении формы таймер внутри потока приостанавливается и не генерит сообщения. Как узнаёте? Код в студию плиз...Название: Re: Обработка сообщений главным GUI потоком Отправлено: Gorin от Сентябрь 23, 2008, 09:19 Насчет таймера я все таки ошибся.
При помощи qtdebug смотрю время отправки приема. Но не могу объяснить некоторые вещи, они закоментированы в коде. Код: //************************ H file*************** Название: Re: Обработка сообщений главным GUI потоком Отправлено: Alex03 от Сентябрь 23, 2008, 10:15 Код: void run(){ Цитировать Qt::AutoConnection If the signal is emitted from the thread in which the receiving object lives, the slot is invoked directly, as with Qt::DirectConnection; otherwise the signal is queued, as with Qt::QueuedConnection. timer - у Вас "живёт" в порождённом MyThread потоке.А вот сам MyThread - "живёт" в главном потоке. Соответственно при Код: connect(&timer, SIGNAL(timeout()),SLOT(slotNextValue())); |