Seite 1 von 1
Exe soll nur einmal gestartet werden können
Verfasst: 15. Mai 2006 11:37
von Delryn
Hallo
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
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

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