#include <QtNetwork/QLocalSocket>
#include <QFileInfo>
HANDLE gHandle1 = nullptr;
#define TIME_OUT (500) // 500ms
Application1::Application1(int& argc, char** argv)
:QApplication1(argc, argv)
,ptrWidget_(nullptr)
,isRunning_(false)
,localServer_(nullptr)
{
}
Application1::~Application1()
{
closeServer();
}
void Application1::closeServer()
{
if (localServer_ == nullptr){
return;
}
localServer_->close();
}
void Application1::setServerName(const QString& name)
{
serverName_ = name;
initLocalConnection();
}
bool Application1::isRunning()
{
return isRunning_;
}
void Application1::newLocalConnection()
{
QLocalSocket* socket = localServer_->nextPendingConnection();
if (socket) {
socket->waitForReadyRead(2 * TIME_OUT);
delete socket;
// 其他处理,如:读取启动参数
activateWindow();
}
}
void Application1::initLocalConnection()
{
isRunning_ = false;
QLocalSocket socket;
socket.connectToServer(serverName_);
if (socket.waitForConnected(TIME_OUT)) {
isRunning_ = true;
// 其他处理,如:将启动参数发送到服务端
return;
}
gHandle1 = CreateMutex(NULL, true, QString(serverName_).toStdWString().c_str());
if (GetLastError() == ERROR_ALREADY_EXISTS) {
isRunning_ = true;
return;
}
//连接不上服务器,就创建一个
newLocalServer();
}
void Application1::newLocalServer()
{
localServer_ = new QLocalServer(this);
connect(localServer_,&QLocalServer::newConnection,std::bind(&Application1::newLocalConnection,this));
if (!localServer_->listen(serverName_)) {
// 此时监听失败,可能是程序崩溃时,残留进程服务导致的,移除之
if (localServer_->serverError() == QAbstractSocket::AddressInUseError) {
QLocalServer::removeServer(serverName_); // <-- 重点
localServer_->listen(serverName_); // 再次监听
}
}
}
void Application1::activateWindow()
{
if (ptrWidget_!= nullptr) {
ptrWidget_->show();
ptrWidget_->raise();
ptrWidget_->activateWindow(); // 激活窗口
}
}
一句话概括:用管道监听很好,比共享内存方便,原因,共享内存检测不到进程是否启动,可能是,Qprocess的问题