Permitindo que somente uma instância do programa rode por vez


Para controlar a execução de programas, e permitir apenas 1 instância por vez, vamos utilizar mutex.

Mutexes são mecanismos utilizados para implementar exclusão mútua entre threads.

Um algoritmo de exclusão mútua serve para garantir que regiões críticas de código não sejam executadas simultaneamente, protegendo estruturas de dados compartilhadas de modificações simultâneas.

Windows:


	const int sizeObjName = 80 ;
	char obj_name[sizeObjName];
	obj_name[sizeObjName - 1] = 0;
	
	generateObjectName(obj_name, sizeObjName-1, "MUTEXMEUPROGRAMA");
	
	SetLastError(0);
	
	// criamos o mutex com o nome do nosso programa
	CreateMutex(NULL, FALSE, obj_name); // Library Kernel32.lib
	
	// se ja existir eh porque ja tem uma instancia rodando, entao retornamos falso, pois so podemos rodar 1 instancia
	if (GetLastError() == ERROR_ALREADY_EXISTS)
		return false;	
		
	// Ao termino do programa, o mutex sera deletado automaticamente
Linux:


	// criamos o mutex com o nome do nosso programa
	xHandle = CreateSemaphore(NULL, 1, 1, "MUTEXMEUPROGRAMA");
	DWORD rc = WaitForSingleObject(xHandle, 0);
	
	if (rc == WAIT_OBJECT_0) { // conseguimos criar. sinal de que nao havia outra instancia rodando
		
		// faco o trabalho ....
		
		// OBS: no linux temos que fechar o handle no fim do programa	
		if (xHandle) {
			ReleaseSemaphore(xHandle, 1, NULL);
			CloseHandle(xHandle);
		}
		
	} else {
	
		// nao funcionou. ja existe uma instancia rodando
		CloseHandle(xHandle);
		xHandle = NULL;
		return false;
	}	





Comentários

Copyright © 2018 Anderson Bravo
www.andersonbravo.com.br
anderson@andersonbravo.com.br