Название: [Qt 4.3.1-Win-Com-vs2005] Как добраться до главного цикла программы Отправлено: Разуев Максим от Август 31, 2007, 13:11 Вопрос такой: Мне надо вызывать определенную функцию в основном цикле обработки сообщений (после обработки событий). Каким образом это можно сделать.
Нужно это потому что у меня есть функционал вывода 3D обьекта в dll. Внутри библиотеки реализован рабочий цикл, ему для обеспечения нормального вывода необходимо синхронизироваться с циклом приложения. В чистой WinAPI программе вызывается специальная функция библиотеки внутри цикла сообщений. Название: Re: [Qt 4.3.1-Win-Com-vs2005] Как добраться до главного цикла программы Отправлено: alex12 от Сентябрь 01, 2007, 21:35 Если чистый WinAPI, то может это:
Код: bool QCoreApplication::winEventFilter ( MSG * msg, long * result ) [virtual] Вообще,думаю, копать надо в сторону QApplication или QCoreApplication. Название: Re: [Qt 4.3.1-Win-Com-vs2005] Как добраться до главного цикла программы Отправлено: Разуев Максим от Сентябрь 01, 2007, 23:16 Сообщения я и так нормально обрабатываю. Мне нужно вызывать одну определенную функцию внутри цикла сообщений.
Вообще это необходимо для корректного вывода библиотекой 3D сцены и обработки событий. Сейчас я вызываю эту функцию через таймер 100 раз в секунду, но работает не очень хорошо. Название: Re: [Qt 4.3.1-Win-Com-vs2005] Как добраться до главного цикла программы Отправлено: alex12 от Сентябрь 02, 2007, 00:55 Кстати, дергать функцию по таймеру мне думается нормальное решение. Таймер все равно работает, посылая сообщение в очередь. Только 100 мс многовато. Можно поставить чуть ли не 5 мс. Если таймер не успевает, то Qt эту ситуацию нормально отрабатывает.
На счет цикла сообщений: нужно в main() QCoreApplication::exec() заменть на свой цикл с QCoreApplication::processEvents(...). Несколько цитат по теме: QApplication: Код: int QCoreApplication::exec () [static] QApplication: Код: void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static] QTimer: Код: As a special case, a QTimer with a timeout of 0 will Название: Re: [Qt 4.3.1-Win-Com-vs2005] Как добраться до главного цикла программы Отправлено: Разуев Максим от Ноябрь 12, 2007, 18:47 Проблема решилась лишь частично. Функцию (3D рендер библиотеки) я вызываю через таймер с нулевым временем(по assist-у это гарантируе вызов таймера при обработке каждого цикла сообщений.
Но при перемещении мышки между виджетом в котором выводится 3D-сцена и другой частью окна, происходим мигание сцены (вероятно перерисовка). При вызове диалога иногда изображение вообще пропадает. Название: Re: [Qt 4.3.1-Win-Com-vs2005] Как добраться до главного цикла программы Отправлено: Вячеслав от Ноябрь 12, 2007, 19:11 Проблема решилась лишь частично. Функцию (3D рендер библиотеки) я вызываю через таймер с нулевым временем(по assist-у это гарантируе вызов таймера при обработке каждого цикла сообщений. НЕ правда Ваша ;)Но при перемещении мышки между виджетом в котором выводится 3D-сцена и другой частью окна, происходим мигание сцены (вероятно перерисовка). При вызове диалога иногда изображение вообще пропадает. Код: As a special case, a QTimer with a timeout of 0 will time out as soon as all the events in the window system's event queue have been processed. Название: Re: [Qt 4.3.1-Win-Com-vs2005] Как добраться до главного цикла программы Отправлено: pastor от Ноябрь 12, 2007, 19:18 Когда нет больше сообщений в очереди IMHO ;) +1 Таймер с 0 таймаутом сработает когда в очереди обработки сообщений не будет событий (все будут обработаны). Т.е. другими словами, таймер срабатывать на "холостом ходу" цикла обработки сообщений |