Exe soll nur einmal gestartet werden können

Alles rund um die Programmierung mit Qt
Antworten
Delryn
Beiträge: 70
Registriert: 24. Februar 2006 11:15

Exe soll nur einmal gestartet werden können

Beitrag 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ß
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Re: Exe soll nur einmal gestartet werden können

Beitrag 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
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag 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.
Delryn
Beiträge: 70
Registriert: 24. Februar 2006 11:15

Beitrag 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 :)
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag 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.
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag 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.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

QtSingleApplication aus den Qt Solutions.
Und KDE hat auch eine Unique Klasse dafür.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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;
    }
    
};
Antworten