Seite 1 von 1

Exe soll nur einmal gestartet werden können

Verfasst: 15. Mai 2006 11:37
von Delryn
Hallo :D
Ich möchte verhindern, dass mehrere Instanzen von meinem Programm gestartet werden können. Was ist da die gängige Methode um das zu verhindern? Ein kleines Beispiel wäre nett ;)

Gruß

Re: Exe soll nur einmal gestartet werden können

Verfasst: 15. Mai 2006 12:58
von QtBerserker
Delryn hat geschrieben:Hallo :D
Ich möchte verhindern, dass mehrere Instanzen von meinem Programm gestartet werden können. Was ist da die gängige Methode um das zu verhindern? Ein kleines Beispiel wäre nett ;)

Gruß
Ein Singleton http://gethelp.devx.com/techtips/cpp_pr ... in0200.asp würde das Problem lösen.

CU Olaf

Verfasst: 16. Mai 2006 08:59
von michams
oder ein Mutex:

Code: Alles auswählen

HANDLE hMultipleStartProtection = OpenMutex(MUTEX_ALL_ACCESS,0,"MyApplicationName");
if(!hMultipleStartProtection)
{
    hMultipleStartProtection = CreateMutex(0,0,"MyApplicationName");
}
else
{
    // bring the existing window to front
    HWND hWnd=FindWindow(0,"MyApplicationName");
    SetForegroundWindow(hWnd);
    return 0;
}
das Ganze einfach gleich als erstes in die main Funktion schreiben. Es wird beim ersten Start ein Mutex erzeugt und bei einem weiteren einfach nur noch die schon offene Instanz in den Vordergrund geholt. Wenn du natürlich keine GUI hast, brauchst du im else-Zweig nur das return.

Verfasst: 22. Mai 2006 16:12
von Delryn
Ich versteh nicht, wie mir ein Singleton hier helfen sollte :? :?:

@michams
Wo kommt die Funktion OpenMutex her? Von Qt? In der Doku kann ich sie nicht finden. Oder ist das eine Lösung die nur unter Windows funktioniert?
Ansonsten ist sie nämlich wunderbar :)

Verfasst: 22. Mai 2006 19:50
von michams
Oh, sorry, hätte dazu schreiben sollen, daß das die Implementierung für Windows ist. Die Funktionen kommen demzufolge aus der WinAPI. Da Mutex aber eigentlich für Multi-Threading-Absicherung gedacht ist, sollten sie in jedem aktuellen System verfügbar sein. Die Implementierungen sind da halt verschieden, hab mal auf die schnelle dieses hier für Windows->Linux gefunden. Wenn du das einsetzen willst, wirst du den Teil auf jeden Fall mit #ifdefs systemspezifisch halten müssen.
Qt bietet auch eine QMutex Klasse an, sieht aber nicht so aus, als ob man die dafür verwenden könnte.

Verfasst: 23. Mai 2006 19:58
von QtBerserker
Delryn hat geschrieben:Ich versteh nicht, wie mir ein Singleton hier helfen sollte :?
Direkt so nicht, aber Du kannst darin elegant vieles verstecken, zB. machen einige bei der Singleton Implementierung das Teil gleich thread safe (mit einem Mutex) zB durch Angabe eines weiteren Template Parameters. boost dürfte so ein Bsp. haben.

Innerhalb der Implementation müsstest Du wohl eine OS spezifische Suche in der Task- bzw. Process Liste durchführen; habe soetwas schon mal vor ewigen Zeiten gesehen, kann aber weder inhaltlich noch mit einer URL dienen, sry.

Verfasst: 24. Mai 2006 16:55
von FlorianBecker
QtSingleApplication aus den Qt Solutions.
Und KDE hat auch eine Unique Klasse dafür.

Verfasst: 24. Mai 2006 18:00
von patrik08
Ich mache es wie ein mail server .... mit den lock file!
(im user home dir ./appname/ hidden file )
wichtig das der class destructor in loescht!!

Wie man ein file schreib mit mutex und sigleton ... kann ich gerne sagen :D nach 3 monaten C & QT erfahrung...

http://ciz.ch/svnciz/dialog_qt/qt4_a/ta ... _tools.cpp

Code: Alles auswählen



int main(int argc, char *argv[]) {
    
    if (!is_file(LOCK_FILE_APPLICATION)) {
    /* session start */
    file_put_contents(LOCK_FILE_APPLICATION,"");
    QApplication a( argc, argv );
	Shop_Main::self()->show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();  
    } else { 
    /* session end */
    return 0;
    }
    
};