PDA

Visualizza la versione completa : Problema di esecuzione


mscala
21-08-2003, 15:41
Ciao a tutti.
In C++ Builder, come posso sapere se una copia del mio programma è già in esecuzione?

Mi spiego meglio:

Supponiamo che abbia creato un progetto che produce un eseguibile di nome Pippo.exe.
A questo eseguibile, associo un collegamento al desktop.
Supponiamo che lo esegua e che lui apra una comune finestra.
Se rieseguo il programma senza chiudere quello appena eseguito, prima della sua esecuzione come faccio ad accorgermi che ne è già in esecuzione un'altra copia?

Spero di essermi spiegato bene.

Ciao a tutti.
Marcello

mscala
24-08-2003, 10:10
Il problema l'ho risolto.

Grazie a tutti lo stesso.
Marcello
:ciauz:

Sergio Pedone
24-08-2003, 17:16
Puoi dirci come lo hai risolto, magari potrà servire a qualcun altro.

Ciao e grazie.

mscala
24-08-2003, 19:32
Siccome non ho ricevuto alcuna risposta, non pensavo potesse essere di interesse.
Comunque non c'è alcun problema:

Il problema è quello di evitare la creazione di istanze multiple.

Per far questo prendere in esame il seguente codice:


WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Application->Title = "";
HWND hPrevApp = ::FindWindow(NULL, "single");

if(hPrevApp)
{
PostMessage(hPrevApp, WM_SYSCOMMAND, SC_RESTORE, 0);
return 0;
}
else
Application->Title = "NomeApplicazione";

try
{
Application->Initialize();
Application->Title = "NomeApplicazione";
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}

Questo evita la creazione dell'istanza aggiuntiva se ne è già presente una.

Sembra però più semplice utilizzare la CreateMutex:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE hInstanceMutex = ::CreateMutex(NULL,TRUE, "PROJECT1");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
if(hInstanceMutex)
CloseHandle(hInstanceMutex);
return 0;
}

try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}

ReleaseMutex(hInstanceMutex);
CloseHandle(hInstanceMutex);
return 0;
}

E' preferibile utilizzare la CreateMutex piuttosto che la FindWindow dato che è molto più sicura e stabile.

Logicamente c'è anche la possibilità di gestire i Semafori, ma questo è molto più complesso.

Tutto quì.

:ciauz:

Loading