![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Доброго всем времени суток!
Не знаю, правильно ли я поступил, поместив этот пост в данный топик, но, все-таки этот вопрос напрямую относится к области функционирования ядра системы. Речь идет о том, чтобы отыскать алго, альтернативный 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, эта процедура частенько вызывает ошибки ни с того ни с сего, причем только на некоторых машинах. Последний раз редактировалось 4kusNick, 14.09.2006 в 16:24. |
|
#2
|
|||
|
|||
|
А не пробовал просто задержать выполнение, т.е.: sleep(15); (больше 30 не ставь - тормозить прога будет).
|
|
#3
|
||||
|
||||
|
Спасбо конечно, но какой Sleep? Нет, конечно, он ничем не поможет!( Sleep просто приостанавливает поток, из которого он вызывается и, соответственно, все сообщения, что система посылает потоку будут копиться в очереди, а мне же, наоборот, нужно все эти сообщения обработать и очистить очередь. Например, при длительных вычислительных циклических операциях сообщения системы тоже копятся в очередь, в результате чего, программа, как бы "подвисает"... Так вот, чтобы она не подвисала, Delphi SDK советует использовать Application.ProcessMessages, но, к огромному сожалению, по крайней мере, в седьмой версии Delphi, эта процедура была реализована не грамотно, в результате чего, в больших программах она вызывает катастрофические последствия на некоторых машинах. Катастрофические для прогаммы, из которой она вызывается)
Ну в общем, Sleep не катит =) Впрочем, я почти разобрался в проблеме при помощи потоков (TThread), но, все же, не хотелось бы создавать лишние потоки, здорово бы было обрабатывать очередь сообщений из основоного потока (потока главной формы). Вот. |
|
#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; Сейчас этот код работатет, но как-то не все сообщения он обрабатывает, а только часть =( |
|
#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
|
||||
|
||||
|
Ок, благодарю, попробую этот вариант...
|
|
#8
|
||||
|
||||
|
Цитата:
, это борландовская реализация в D7, смотри ...borland\delphi7\source\vcl\forms.pas строка 6856 |
|
#9
|
||||
|
||||
|
Ну так я на делфях и программлю же, их реализация меня-то и беспокоит! С чего начался том=пик-то? С того, что я пытаюсь альтернативно обработать сообщения, не вызывая борландовского ProcessMessages, суть как раз в том, чтобы альтернативно реализовать ProcessMEssages, м.б. на ассемблере или еще как-нибудь..
Вообще идеально было бы перевести сишный код CWinThread * pThread = AfxGetThread(); MSG msg; while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) if (!pThread->PumpMessage()) break; на паскаль, я не могу осилить =( Самое главное - невернуться к тому же алго,что используется в ProcessMessages =( |