Форум: "WinAPI";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Внизприем WM_USER в консоли. Найти похожие ветки
← →
GanibalLector © (2004-05-19 00:45) [0]Итак,моя программа(консольная) вызывает некоторые ф-ции из DLL.Эти ф-ции весьма длительно выполняются.Соответственно,из DLL я буду посылать сообщения в консоль(а в ней будет индикатор выполнения).Но,к сожалению,не знаю как принимать сообщения в консоли.Подскажите как быть.Заранее СПАСИБО!!!
← →
GanibalLector © (2004-05-19 15:30) [1]Удалено модератором
Примечание: Создание пустых сообщений
← →
GanibalLector © (2004-05-20 00:09) [2]Удалено модератором
← →
default © (2004-05-20 00:11) [3]невидимое окно?
← →
GanibalLector © (2004-05-20 00:34) [4]2 default ©
А зачем???Ведь можно и в консоли...Только я не знаю как,млин!
← →
Style © (2004-05-20 08:37) [5]Может сделать свой обработчик сообщений?
PeekMessage?
← →
Digitman © (2004-05-20 09:03) [6]
> Эти ф-ции весьма длительно выполняются
> а в ней будет индикатор выполнения
а что мешает из DLL, в которой крутится некий длит.цикл, при каждой итерации вызывать WriteLn() ?
или тебе при этом нужно реагировать на интерактивные события польз.воода, т.е. одновременно "висеть" на readll() ? тогда для начала организуй в ДЛЛ доп.код.поток
← →
GanibalLector © (2004-05-20 19:18) [7]2 Digitman © (20.05.04 09:03) [6]
Спасибо Digitman,выручил.Я даже и предположить не мог,что writeln или WriteConsolе можно вызывать из ДЛЛ.
← →
vertal © (2004-05-21 02:03) [8]Я предлагаю делать проще:так как 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
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.031 c