Cómo escribir una aplicación con Qt que pueda ejecutar sólo una instancia a la vez
Hay varias formas de lograr esto:
1. Cree una instancia mutex usando la API de Windows:
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HANDLE hMutex = CreateMutex(NULL, TRUE, L "YourApp"); // Crea una instancia mutex para asegurar que solo se esté ejecutando una instancia
if(hMutex != NULL)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
QMessageBox::critical(qApp->activeWindow(), QObject.:tr("Una instancia de esta aplicación se ha ejecutado!"), QObject::tr("¡Sólo se puede ejecutar una instancia a la vez!"));
return 1;
} p>
}
}
... // Aquí está el código de inicio normal
}
Nota: Por razones de seguridad, CreateMutex () La cadena debe ser un GUID único. Visual Studio tiene una herramienta para generar GUID Menú "Herramientas" -> Menú "Herramientas" -> "Crear GUID", seleccione el formulario definido correspondiente, créelo y cópielo en el. portapapeles.
Desventajas de este método: 1. Utiliza la API de Windows y no puede ser multiplataforma 2. No puede activar automáticamente la instancia de la ventana anterior.
2. Utilice la enumeración API de Windows cada vez que inicie un proceso y utilice la función SetProp() para establecer las propiedades de la ventana actual cuando la ejecute por primera vez, de modo que pueda enumerarla. la próxima vez que lo inicie, busque una ventana con este atributo en el proceso. Si la encuentra, significa que hay una instancia en ejecución y la ventana en la instancia se activará, si no la encuentra, se iniciará normalmente.
Este enfoque resuelve la segunda deficiencia del enfoque anterior, pero depende demasiado de las funciones API de Windows (que todavía parecen ser funciones de MFC y no parecen funcionar con programas Qt). Si está interesado, puede probar el código en este enlace
3. Utilizando QLocalSocket y QLocalServer, la idea básica es:
Cuando se inicia la aplicación, primero intentará conectarse. a QLocalServer, si la conexión falla, significa que esta es la primera instancia y se crea un QLocalServer; de lo contrario, se crea un QLocalServer. Si la conexión falla, significa que es la primera instancia y, por lo tanto, se crea dicho QLocalServer; de lo contrario, al QLocalServer se le envían parámetros de inicio y se cierra. La primera instancia de QLocalServer puede manejar parámetros recibidos de instancias posteriores (como activar la ventana de la primera instancia). Hay un código de muestra detallado en este enlace como referencia.
Nota: cuando utilice QLocalSocket y QLocalServer, debe incluir la biblioteca QtNetwork en el archivo del proyecto.
4. Utilice la clase QtSingleApplication proporcionada en la solución Qt; método, recomendado)
Descargue el paquete de código fuente de QtSingleApplication desde ftp://ftp.qt.nokia.com/qt/solutions/lgpl/, descomprímalo y configúrelo y compílelo de acuerdo con las instrucciones en INSTALAR .TXT, elegí compilarlo en una biblioteca dinámica, de modo que solo necesite consultar el archivo de encabezado y el archivo lib la próxima vez que lo use, lo cual es más conveniente.
El uso es muy simple: simplemente reemplace el objeto QApplication en el main () original con el objeto QtSingleApplication y llame al método isRunning () para juzgar.
//Código original
int main(int argc, char **argv)
{
QApplication app(argc, argv );
MyMainWidget mmw;
mmw.show() ;
return app.exec();
}
//Modificar código
int main(int argc, char **argv)
{
QtSingleApplication app(argc, argv) ;
if (app.isRunning())
devuelve 0;
MyMainWidget mmw;
mmw.display();
Return app.exec();
}
Nota 1: La implementación de QtSingleApplication básicamente usa QLocalServer y QLocalSocket, por lo que también depende de la biblioteca QtNetwork;< / p>
Nota 2: El código anterior solo muestra el uso más simple de QtSingleApplication. Esta clase tiene más usos. Consulte los ejemplos y la documentación en el paquete fuente.
En este enlace se pueden encontrar varios usos de QtSingleApplication (usar el código fuente directamente, compilar en una biblioteca dinámica, etc.): Programa Qt que ejecuta solo una instancia.