Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

прием WM_USER в консоли. [D5, Win95/98, WinXP]


GanibalLector ©   (2004-05-19 00:45:00) 

Итак,моя программа(консольная) вызывает некоторые ф-ции из DLL.Эти ф-ции весьма длительно выполняются.Соответственно,из DLL я буду посылать сообщения в консоль(а в ней будет индикатор выполнения).Но,к сожалению,не знаю как принимать сообщения в консоли.Подскажите как быть.Заранее СПАСИБО!!!


vertal   (2004-05-21 02:03:00) [1]

Я предлагаю делать проще:так как dll как я понял твоя , то свою очень_длительно_выполняющуюся _функцию дополнительно снабди 2 параметрами:

Function Very_SLow(...,PCurrentReady:PCardinal;PUserBreak:PBoolean=Nil):SomeType;
Var
 UserBreak:Boolean;
...
Begin
 if (PUserBreak=Nil)then Begin PUserBreak:=@UserBreak;UserBreak:=False;End;
...
 while( (...)and not PUserBreak^)do
    ...
    Inc(PCurrentReady^);
  ...
end;

В самой функции в качетсве счетчика прогресса используй не локальную переменную , а PCurrentReady^;
А в программе можно создать отдельный поток с таймером , котрорый скажем каждую секунду будет писать
 writeln('Ready:',(PCurrentReady^/PTotal^*100):2:2,'%');
Или просто из dll вызывать CallBack функцию для индикации прогресса
Вот как делал я:

...
CurrentPercent:Cardinal=0;
Len_Input:Cardinal;

Procedure MyTimerProc(MyHWND:hwnd;Msg:UINT;idEvent:UINT;dwTime:DWORD);stdcall;
Begin
 writeln('Ready:',((CurrentPercent/Len_Input)*100):2:2,'%');
End;

fUNCTION ThreadFunc(Const lpTHreadParams:Pointer):DWORD ;STDCALL;
Const
 TimerInterval_msec:Cardinal=1000;
Var
 MyMsg:TMsg;
 TimerID:Cardinal;
Begin
  TimerID:=SetTimer(0,0,TimerInterval_msec,@MyTimerProc);
  if TimerID<>0 then while GetMessage(MyMsg,0,0,0) do DispatchMessage(MyMsg);
  if TimerID<>0 then
  Begin
    MyTimerProc(0,0,0,0);
    KillTimer(0,TimerID);
  End;
  Result:=0;
End;
Var
 hThread:THandle;
 ThreadID:Cardinal;
Begin
 ...
hThread:=CreateThread(Nil,0,@ThreadFunc,Nil,0,ThreadID);
  My_Slow_Proc(...,@CurrentPercent,Nil);
  while not PostThreadMessage(ThreadID,WM_QUIT,0,0) do sleep(0);
  WaitForSingleObject(hThread,INFINITE);
  CloseHandle(hThread);
 ...
End.

ЗЫ
Код проверялся только в Win98


GanibalLector   (2004-05-20 19:18:00) [2]

2 Digitman©   (20.05.04 09:03) [6]
Спасибо Digitman,выручил.Я даже и предположить не мог,что writeln или WriteConsolе можно вызывать из ДЛЛ.


Digitman   (2004-05-20 09:03:00) [3]


> Эти ф-ции весьма длительно выполняются


> а в ней будет индикатор выполнения


а что мешает из DLL, в которой крутится некий длит.цикл, при каждой итерации вызывать WriteLn() ?

или тебе при этом нужно реагировать на интерактивные события польз.воода, т.е. одновременно "висеть" на readll() ? тогда для начала организуй в ДЛЛ доп.код.поток


Style   (2004-05-20 08:37:00) [4]

Может сделать свой обработчик сообщений?
PeekMessage?


GanibalLector   (2004-05-20 00:34:00) [5]

2 default ©  
А зачем???Ведь можно и в консоли...Только я не знаю как,млин!


default   (2004-05-20 00:11:00) [6]

невидимое окно?


GanibalLector   (2004-05-20 00:09:00) [7]

Удалено модератором


GanibalLector   (2004-05-19 15:30:00) [8]

Удалено модератором
Примечание: Создание пустых сообщений


Наверх

Титульная страница Поиск, карта сайта Написать письмо