Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

прием 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 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
14-1086896293
gn
2004-06-10 23:38
2004.06.27
В обозримом будущем ожидается появление саморазмножающихся нанома


1-1087046668
Tr0sT
2004-06-12 17:24
2004.06.27
Цвет символов в TMemo


3-1086158603
avgur
2004-06-02 10:43
2004.06.27
FB 1.5.0.4306


4-1082150563
mouse_web
2004-04-17 01:22
2004.06.27
Работа с COM портами (XComDrv)


3-1086001980
ossa
2004-05-31 15:13
2004.06.27
Покажите ссылки на статьи или документация по работе с Ораклом