Autor Téma: Aplikace bez GUI a obsluha zprav  (Přečteno 3558 krát)

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1209
  • Karma: 44
    • Verze Delphi: 7, 2010
Aplikace bez GUI a obsluha zprav
« kdy: 12-10-2012, 09:47:27 »
Mam 2 otazky :)

mam aplikaci bez GUI (ne konzolovou) a potrebuji obsluhu ukonceni

to potrebuju kvuli tomu vytvaret cele okno?
Kód: Delphi [Vybrat]
  1.         wClass.lpszClassName:= 'CN';
  2.         wClass.lpfnWndProc :=  @WindowProc;
  3.         wClass.hInstance := hInstance;
  4.         wClass.hbrBackground:= 1;
  5.  
  6.         Windows.RegisterClass(wClass);
  7.  
  8.         CreateWindow(wClass.lpszClassName,'-',
  9.                       WS_OVERLAPPEDWINDOW,
  10.                       0,0,0,0,0,0,hInstance,nil);
  11.  
  12.         while GetMessage(Msg,0,0,0) do
  13.           begin
  14.             TranslateMessage(Msg);
  15.  
  16.             DispatchMessage(Msg);
  17.           end;

a ta druha ... co Wokna udelaji se zbytkem kodu za tim while? proste ustrihnou kus aplikace? :D

a jeste jedna posledni ... pokud aplikace nema obsluhu zprav, tak je sestrelena okamzite, kdyz se system ukoncuje apod.?
« Poslední změna: 12-10-2012, 09:55:20 od <z> »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3559
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Aplikace bez GUI a obsluha zprav
« Odpověď #1 kdy: 12-10-2012, 13:23:28 »
Podívej se na http://www.ritlabs.com/en/products/tinyweb/download.php - TinyWeb, speciálně na část inicializace.

Je tam
Kód: Delphi [Vybrat]
  1. // --- Perform main loop
  2.   MainThread := TMainThread.Create(False);
  3.  
  4.   MessageLoop;
  5.  
  6.   CloseSocket(ServerSocketHandle);
  7.   ServerSocketHandle := INVALID_SOCKET;
  8.  
  9.   MainThread.Terminate;
  10.   WaitForSingleObject(MainThread.Handle, INFINITE);
  11.   MainThread.Free;
  12.  
  13.  

a pak
Kód: Delphi [Vybrat]
  1. procedure MessageLoop;
  2. var
  3.   M: TMsg;
  4.   WP: TWndProc;
  5. begin
  6.   WP := TWndProc.Create;
  7.   WP.Handle := AllocateHWnd(WP.WndProc);
  8.   repeat
  9.     GetMessage(M, 0, 0, 0);
  10.     if M.Message = WM_QUIT then
  11.     begin
  12.       Leave := True;
  13.       Break;
  14.     end;
  15.     TranslateMessage(M);
  16.     DispatchMessage(M);
  17.   until Leave;
  18.   WP.Free;
  19. end;
  20.  


Tj. spustí se vlákno a v hlavním programu je jen smyčka zpráv čekající na WM_QUIT.

Celý program je dobře čitelný - tak se na něj kukni.
Embarcadero MVP - Czech republic

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1209
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Aplikace bez GUI a obsluha zprav
« Odpověď #2 kdy: 12-10-2012, 14:30:01 »
dik ;)

ad 1) takze ano, CreateWindow je potreba pouzit, TinyWeb to ma uplne stejne, jen sofistikovaneji :)

ad 2) ma mylna predstava byla zpusobena tim, ze TStreamWriter nefunguje na WinXP tak, jak jsem zrejme cekal :(

ad 3) pokud se da Sleep do hlavniho vlakna, tak Wokna cekaj a pak sestreli,
pokud je Sleep ve vytvorenem vlakne, tak to zrejme problem neni :)
« Poslední změna: 12-10-2012, 14:44:32 od <z> »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3559
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Aplikace bez GUI a obsluha zprav
« Odpověď #3 kdy: 12-10-2012, 15:27:54 »
Ještě když už jsem tu vytáhl ten TinyWeb, tak se mi tam líbí na začátku ta část s

Kód: Delphi [Vybrat]
  1. procedure FreeDummyLibraries;
  2. var
  3.   I: Integer;
  4. begin
  5.   I := GetModuleHandle('OleAut32'); if I <> 0 then FreeLibrary(I);
  6.   I := GetModuleHandle('Ole32'); if I <> 0 then FreeLibrary(I);
  7.   I := GetModuleHandle('RPCRT4'); if I <> 0 then FreeLibrary(I);
  8.   I := GetModuleHandle('AdvAPI32'); if I <> 0 then FreeLibrary(I);
  9.   I := GetModuleHandle('GDI32'); if I <> 0 then FreeLibrary(I);
  10.   I := GetModuleHandle('COMCTL32'); if I <> 0 then FreeLibrary(I);
  11.   I := GetModuleHandle('USER32'); if I <> 0 then FreeLibrary(I);
  12. end;
  13.  

tj. uvolní po inicializaci všechny DLL co vyloženě nepotřebuje. Nevím, zda to má v současnosti ještě nějaký význam, ale z principu se mi to líbí.

Asi dobrej oddíl.
« Poslední změna: 12-10-2012, 15:31:06 od Radek Červinka »
Embarcadero MVP - Czech republic