Doppelten Programmstart verhindern ?

Kachelator hat gesagt.:
Übrigens ist deine Singleton-Implementierung abgesehen von ein paar Details nicht schlecht.

Danke, ist aber wiegesagt nur aus dem Kopf....hab gerade keinen Compiler zur Hand.


Kachelator hat gesagt.:
Der private Destruktor verhindert nachhaltig auch den Einsatz von Copyconstructor und Zuweisungsoperator. Allerdings: Was passiert am Ende mit der einzelnen Instanz? Die hast du genewt. Und wer gibt sie frei? Das ergibt ein Memoryleck!

Die Klasse wird normalerweise ja auch als Basisklasse vorgeschoben, und da braucht man ja fast nie einen Copy Konstruktor oder Zuweisungsoperator. Bei mir gibt den Pointer keiner frei, müsste man dann wahrscheinlich mit einer weiteren Statischen Funktion Realisieren...

Aber man findet unter google eine ganze menge zum Entwurfsmuster Singleton, denke da werden sicher auch Antworten sein die ich dir wegen meines geringeren Wissensstandes leider nicht geben kann, Sorry.
 
Hallo!

Du könntest auch einfach mit nem sogenanntem Lock-File Arbeiten.
Wenn du beim Start eine Lock-Datei findest breche Startvorgang ab ...
Wenn du keine findest erstelle eine und fahre fort.
Beim Beenden deiner Anwendung solltest du allerdings das Lock-File auch wieder löschen ;-)

Auf die gleiche Art kann man#s mit nem Socket machen ...

Gruß Tom
 
@Thomas Darimont

Die Lösung finde ich auch gut, die merke ich mir mal, weils extrem einfach zu programmieren ist ;)
Danke für den Tipp
 
Ersteinmal danke für die zahlreichen Antworten.
Das mit CMutex finde ich gut. Hab versucht es in mein Programm einzubauen, leider ohne Erfolg. Bekomme es einfach nicht hin. Kann mir jemand ein Beispiel geben ?
Würde mich über einen Code freuen, danke!
 
Wenn das Programm ein zweites Mal gestartet wird, ist bereits vom ersten Programm das Handle gespeichert. Das fragt man halt ab und unterbricht die Initialisierung des zweiten Programms und kann ohne ein FindWindow oder soetwas das erste Fenster wieder aufrufen.
Geht natürlich auch anders, z.B. mit einer BOOL-variable. Da muss man das Handle dann nicht so umständlich abspeichern, muss dafür aber das erste Fenster mit FindWindow suchen.

hier mal ein vereinfachtes Beispiel mit BOOL wie das bei einer standard-mfc anwendung aussehen kann
Code:
// includes

// Datensegment erstellen
#pragma data_seg("DATASEG_TEST")

static BOOL isRunning = FALSE;

#pragma data_seg()
#pragma comment(linker, "/section:DATASEG_TEST,rws")

BEGIN_MESSAGE_MAP(CTestApp, CWinApp)
	//{{AFX_MSG_MAP(CTestApp)
	//}}AFX_MSG
	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

CTestApp::CTestApp()
{
}

CTestApp theApp;

BOOL CTestApp::InitInstance()
{
	// Abfrage ob bereits eine Instanz läuft
	if(isRunning)
	{
		// abbrechen
		return FALSE;
	}

	// isRunning auf TRUE setzen, damit keine weiter Instanz gestartet werden kann
	isRunning = TRUE;

	// restliche initialisierungen

	CTestDlg dlg;
	m_pMainWnd = &dlg;
	int nResponse = dlg.DoModal();

	return FALSE;
}

Bei mir hats bis jetzt immer ohne Probleme funktioniert.

Gruß
Shai
 
Hallo Shai,
hab dein Code mal an den richtigen Stellen eingefügt.
Hat leider nicht gebracht!
Ist da ein Fehler drin?
Währe nett wenn mir jemand #pragma Erklären könnte.

danke
 
Hallo Shai,
hab den Fehler gefunden.

Code neu:
Code:
#pragma data_seg(" DATASEG_TEST")

static BOOL isRunning = FALSE;

#pragma data_seg()
#pragma comment(linker, "/section: DATASEG_TEST,rws")

BOOL CTestApp::InitInstance()
{
	// Abfrage ob bereits eine Instanz läuft
	if(isRunning)
	{
		// abbrechen
		return FALSE;
	}

	// isRunning auf TRUE setzen, damit keine weiter Instanz gestartet werden kann
	isRunning = TRUE;

	// restliche initialisierungen

	CTestDlg dlg;
	m_pMainWnd = &dlg;
	int nResponse = dlg.DoModal();

	return FALSE;
}

So geht es !
Danke, an euch alle!
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück