|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Альтернатива Application.ProcessMessages
Доброго всем времени суток!
Не знаю, правильно ли я поступил, поместив этот пост в данный топик, но, все-таки этот вопрос напрямую относится к области функционирования ядра системы. Речь идет о том, чтобы отыскать алго, альтернативный Application.ProcessMessages, то есть, который бы позволял ОСи и программе обменяться сообщениями, которые находятся "в очереди" на обработку. Сейчас использую такой алго: Код:
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; Но этот код дааалеко не альтернатива для Application.ProcessMessages =) В сях я это дело писал так: Код:
CWinThread * pThread = AfxGetThread(); MSG msg; while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) if (!pThread->PumpMessage()) break; и как это перетащить на паскаль (Delphi) не понимаю Почему я не хочу юзать ProcessMessages, да потому, что, по-крайней мере, в седьмой версии Delphi, эта процедура частенько вызывает ошибки ни с того ни с сего, причем только на некоторых машинах. THE CRACKER IS OUT THERE Последний раз редактировалось 4kusNick, 14.09.2006 в 16:24. |
#2
|
|||
|
|||
А не пробовал просто задержать выполнение, т.е.: sleep(15); (больше 30 не ставь - тормозить прога будет).
|
#3
|
||||
|
||||
Спасбо конечно, но какой Sleep? Нет, конечно, он ничем не поможет!( Sleep просто приостанавливает поток, из которого он вызывается и, соответственно, все сообщения, что система посылает потоку будут копиться в очереди, а мне же, наоборот, нужно все эти сообщения обработать и очистить очередь. Например, при длительных вычислительных циклических операциях сообщения системы тоже копятся в очередь, в результате чего, программа, как бы "подвисает"... Так вот, чтобы она не подвисала, Delphi SDK советует использовать Application.ProcessMessages, но, к огромному сожалению, по крайней мере, в седьмой версии Delphi, эта процедура была реализована не грамотно, в результате чего, в больших программах она вызывает катастрофические последствия на некоторых машинах. Катастрофические для прогаммы, из которой она вызывается)
Ну в общем, Sleep не катит =) Впрочем, я почти разобрался в проблеме при помощи потоков (TThread), но, все же, не хотелось бы создавать лишние потоки, здорово бы было обрабатывать очередь сообщений из основоного потока (потока главной формы). Вот. THE CRACKER IS OUT THERE |
#4
|
||||
|
||||
Если нужно из основного потока, то без Application.ProcessMessages ты врятли обойдешься... Может тебя устроит этот вариант - http://delphisources.ru/forum/showth...=1440#post1440 (смотри сообщения 4 и 6).
|
#5
|
||||
|
||||
Спасибо, но нет, это не совсем то.
Все-таки, хотелось бы как-то обойтись без ProcessMessages =( Вот с этим бы как-нибудь поиграться: if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; Сейчас этот код работатет, но как-то не все сообщения он обрабатывает, а только часть =( THE CRACKER IS OUT THERE |
#6
|
||||
|
||||
Код:
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; Код:
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin Result := True; if Msg.Message <> WM_QUIT then begin Handled := False; if Assigned(FOnMessage) then FOnMessage(Msg, Handled); if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; end |
#7
|
||||
|
||||
Ок, благодарю, попробую этот вариант...
THE CRACKER IS OUT THERE |
#8
|
||||
|
||||
Цитата:
|
#9
|
||||
|
||||
Ну так я на делфях и программлю же, их реализация меня-то и беспокоит! С чего начался том=пик-то? С того, что я пытаюсь альтернативно обработать сообщения, не вызывая борландовского ProcessMessages, суть как раз в том, чтобы альтернативно реализовать ProcessMEssages, м.б. на ассемблере или еще как-нибудь..
Вообще идеально было бы перевести сишный код CWinThread * pThread = AfxGetThread(); MSG msg; while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) if (!pThread->PumpMessage()) break; на паскаль, я не могу осилить =( Самое главное - невернуться к тому же алго,что используется в ProcessMessages =( THE CRACKER IS OUT THERE |