Главная страница
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.48 MB
Время: 0.034 c
1-1086768073
KSergey
2004-06-09 12:01
2004.06.27
О построении DBGridEh


14-1086896329
YurikGL
2004-06-10 23:38
2004.06.27
Оштрафовали создателя сайта за гиперссылку на 25 $


14-1086983057
Феликс
2004-06-11 23:44
2004.06.27
Подскажите хороший форум потолько по Visual Basic


1-1086939093
an-na2002
2004-06-11 11:31
2004.06.27
Проблема с греческими буквами


14-1086615778
j
2004-06-07 17:42
2004.06.27
Есть новости?