Newsgroup: it.comp.lang.delphi
Titolo: Console Application che non si deve chiudere

Salve a tutti.
Ho creato un "Console Application", la quale esegue un thread parallelo
il quale svolge un compito ciclico.
Il thread principale, pero' dovrebbe rimanere attivo in attesa che
l'applicazione venga chiusa dal sistema.
L'applicazione e' una "Console Application", ma che pero' non apre la
finestra DOS alla sua esecuzione perche' ho rimosso :
{$APPTYPE CONSOLE}
Ora pero' col seguente codice, l'applicazione esegue la funzione del
thread, ma poi alla fine della sua esecuzione, termina completamente il
processo:
program Cam;
//{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows,
  Forms,
  Dialogs,
  CamzUtils in 'CamUtils.pas';
procedure start();
var
  ThreadID: DWord;
  action: Integer;
  CU: TCamUtils;
begin
  CU := TCamUtils.Create( application.ExeName );
  action := CU.goMain();
  if ( action > 0 ) then
  begin
    Application.Terminate()
  end else begin
// ESECUZIONE DEL THREAD
    CU.threadGo();
  end;
end;
begin
  Application.Initialize;
  start();
  Application.Run;
end.
Come far si che l'applicazione non termini, evitando cose orrende come
un loop "while true" ??
Grazie infinite
Ciao

 un loop "while true" ??
se non deve fare piů nulla, e non deve nemmeno chiudersi, č palese che debba 
essere messa in loop infinito. Per evitare che la CPU vada al 100% fai un 
ciclo while true con dentro uno sleep(100000) o simile. Perchč mai sarebbe 
una cosa "orrenda" se risponde alla tua esigenza, e tra l'altro lo fa con 
una sola riga di programma?
Avalon 

 una sola riga di programma?
Con una sleep nel thread principale succede poi che quando il sistema
operativo invia al processo il segnale di chiusura questo non risponde
prontamente e ciò causa la segnalazione che il processo "non
risponde".
Non c'è modo di mettersi in ascolto degli eventi windows ? un po' come
potrebbe essere in C la funzione "select", così da sbloccarsi
automaticamente quando all'applicazione giunga un segnale dal SO ?
Grazie

 Non c'è modo di mettersi in ascolto degli eventi windows ?
si, c'è un messaggio specifico che va in broadcast a tutte le applicazioni 
alla chiusura del sistema. Googla un pò e vedrai che troverai il modo per 
intercettarlo.
Avalon 


In C la cosa mi è nota (si veda il codice sottostante), ma alcune cose
mi sfuggono come trasformarle in Delphi (7).
Infatti il codice C sottostante, anche senza la realizzazione della
finestra, rimane in ascolto del messaggio di chiusura senza far un loop
grezzo, ma con un loop dove nella condizione rimane in attesa di un
messaggio.
Ciao
//gcc -mwindows -mno-cygwin test_win.c -o test_win.exe
#include <windows.h>
const char g_szClassName[] = "myWindowClass";
/*
* FUNZIONE DI CALLBACK PER LA DECISIONE DELL'AZIONE DA COMPIERE UNA
VOLTA
* CHE VIENE PERVENUTO UN SEGNALE ....... E IN DELPHI ?
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
	switch(msg)
	{
			case WM_CLOSE:
				DestroyWindow(hwnd);
				break;
			case WM_DESTROY:
				PostQuitMessage(0);
				break;
			default:
				return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}
int WINAPI WinMain (
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow
	)
{
	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;
	wc.cbSize			= sizeof(WNDCLASSEX);
	wc.style 			= 0;
	wc.lpfnWndProc 		= WndProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= hInstance;
	wc.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground	= (HBRUSH) (COLOR_WINDOW+1);
	wc.lpszMenuName	= NULL;
	wc.lpszClassName	= g_szClassName;
	wc.hIconSm		= LoadIcon(NULL, IDI_APPLICATION);
	if(!RegisterClassEx(&wc))
	{
		MessageBox(NULL, "Window Registration Failed  :(", "Error!",
MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}
	hwnd = CreateWindowEx (
		WS_EX_CLIENTEDGE,
		g_szClassName,
		"il titolo",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
		NULL, NULL, hInstance, NULL);
	if( hwnd == NULL )
	{
		MessageBox(NULL, "Window Creation Failed 2", "Error!",
MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}
       // NON VIENE COSTRUITA LA FINESTRA
	//ShowWindow(hwnd, nCmdShow);
	//(UpdateWindow(hwnd);
/*
* QUA POTREI LANCIARE UN THREAD PARALLELO E IL TUTTO RIMARREBBE FERMO I
* N ATTESA DEL SEGNALE DI CHIUSURA.
*/
	while( GetMessage(&Msg, NULL, 0, 0) > 0 )
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
 
	return Msg.wParam;
 
}

 un loop "while true" ??
Perché non la trasformi in un servizio di Windows?
Ciao,
Andrea