Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Problema di esecuzione

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    11

    Problema di esecuzione

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    11

    Risolto

    Il problema l'ho risolto.

    Grazie a tutti lo stesso.
    Marcello

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Puoi dirci come lo hai risolto, magari potrà servire a qualcun altro.

    Ciao e grazie.
    Slack? Smack!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    11

    Senz'altro

    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ì.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.