Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.09.2006, 16:21
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
Печаль Альтернатива 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  
Старый 17.09.2006, 14:38
SilVaN SilVaN вне форума
Прохожий
 
Регистрация: 17.09.2006
Адрес: Самара, Куйбышевский р-н, 116 км.
Сообщения: 3
Репутация: 10
По умолчанию

А не пробовал просто задержать выполнение, т.е.: sleep(15); (больше 30 не ставь - тормозить прога будет).
Ответить с цитированием
  #3  
Старый 18.09.2006, 11:18
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Спасбо конечно, но какой Sleep? Нет, конечно, он ничем не поможет!( Sleep просто приостанавливает поток, из которого он вызывается и, соответственно, все сообщения, что система посылает потоку будут копиться в очереди, а мне же, наоборот, нужно все эти сообщения обработать и очистить очередь. Например, при длительных вычислительных циклических операциях сообщения системы тоже копятся в очередь, в результате чего, программа, как бы "подвисает"... Так вот, чтобы она не подвисала, Delphi SDK советует использовать Application.ProcessMessages, но, к огромному сожалению, по крайней мере, в седьмой версии Delphi, эта процедура была реализована не грамотно, в результате чего, в больших программах она вызывает катастрофические последствия на некоторых машинах. Катастрофические для прогаммы, из которой она вызывается)
Ну в общем, Sleep не катит =)
Впрочем, я почти разобрался в проблеме при помощи потоков (TThread), но, все же, не хотелось бы создавать лишние потоки, здорово бы было обрабатывать очередь сообщений из основоного потока (потока главной формы). Вот.
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #4  
Старый 18.09.2006, 14:29
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Если нужно из основного потока, то без Application.ProcessMessages ты врятли обойдешься... Может тебя устроит этот вариант - http://delphisources.ru/forum/showth...=1440#post1440 (смотри сообщения 4 и 6).
Ответить с цитированием
  #5  
Старый 18.09.2006, 15:37
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Спасибо, но нет, это не совсем то.
Все-таки, хотелось бы как-то обойтись без ProcessMessages =(
Вот с этим бы как-нибудь поиграться:

if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;

Сейчас этот код работатет, но как-то не все сообщения он обрабатывает, а только часть =(
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #6  
Старый 18.09.2006, 18:44
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Код:
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  
Старый 20.09.2006, 11:25
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Ок, благодарю, попробую этот вариант...
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #8  
Старый 21.09.2006, 05:43
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от 4kusNick
Ок, благодарю, попробую этот вариант...
Дык это не вариант , это борландовская реализация в D7, смотри ...borland\delphi7\source\vcl\forms.pas строка 6856
Ответить с цитированием
  #9  
Старый 21.09.2006, 10:56
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Ну так я на делфях и программлю же, их реализация меня-то и беспокоит! С чего начался том=пик-то? С того, что я пытаюсь альтернативно обработать сообщения, не вызывая борландовского 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
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:00.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter