![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
прием 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]Удалено модератором
Примечание: Создание пустых сообщений