Qt4.8单实例启动的一种方法
来源:互联网 发布:松江3208g编程类型代码 编辑:程序博客网 时间:2024/05/18 12:34
原理是使用Qt的QLocalServer和QLocalSocket类创建一个虚拟服务端(因为不是真实的socket,所以称之为虚拟)。
程序启动时检测同名服务端是否启动,如果服务端已经启动,则退出,否则创建一个服务端并继续启动。
代码如下:
头文件:
#include <QApplication>class QLocalServer;class YxsSingleApplication : public QApplication{ Q_OBJECTpublic: YxsSingleApplication(int &argc, char **argv); ~YxsSingleApplication(); bool isRunning();public slots: void slotNewConnection();private: void initConnection(); void createServer(); void setWindowActivated();private: QWidget *m_widget; QLocalServer *m_server; QString m_server_name; bool m_isRunning;};
YxsSingleApplication::YxsSingleApplication(int &argc, char **argv) : QApplication(argc, argv), m_widget(0), m_server(0), m_server_name(""), m_isRunning(false){ m_server_name = QFileInfo(QCoreApplication::applicationFilePath()).fileName(); initConnection();}YxsSingleApplication::~YxsSingleApplication(){}bool YxsSingleApplication::isRunning(){ return m_isRunning;}void YxsSingleApplication::slotNewConnection(){ QLocalSocket *socket = m_server->nextPendingConnection(); if (socket) { socket->waitForReadyRead(1000); delete socket; setWindowActivated(); }}void YxsSingleApplication::initConnection(){ QLocalSocket socket; // 连接以应用程序名称为server name的server // 如果连接不上则代表未启动,此时创建一个新的server m_isRunning = false; socket.connectToServer(m_server_name); if (socket.waitForConnected(500)) { m_isRunning = true; return; } createServer();}void YxsSingleApplication::createServer(){ m_server = new QLocalServer(this); connect(m_server, SIGNAL(newConnection()), this, SLOT(slotNewConnection())); if (!m_server->listen(m_server_name)) { // 此时监听失败,可能是程序崩溃是残留进程的服务所导致,移除 if (QAbstractSocket::AddressInUseError == m_server->serverError()) { QLocalServer::removeServer(m_server_name); m_server->listen(m_server_name); } }}void YxsSingleApplication::setWindowActivated(){ if (m_widget) { m_widget->show(); m_widget->raise(); m_widget->activateWindow(); }}
使用方式:
int main(int argc, char *argv[]){ YxsSingleApplication app(argc, argv); if (!app.isRunning()) { YxsMainWindow win; win.show(); return app.exec(); } return 0;}
0 0
- Qt4.8单实例启动的一种方法
- c#实现程序启动唯一实例的一种方法
- c#实现程序启动唯一实例的一种方法
- C#实现程序启动唯一实例的一种方法
- 单例模式的一种实现方法
- 单例模式的一种实现方法
- 一种单例的实现方法
- C++的单实例方法
- 另外一种运行实例一次的方法
- 解决杀毒软件不能启动的一种方法
- 实现启动动画的一种方法
- 一种基于BIOS的WINCE启动方法
- JSP中表单数据存储的一种通用方法
- 对于JSP中表单数据存储的一种通用方法
- JSP中表单数据存储的一种通用方法
- JSP中表单数据存储的一种通用方法
- VS2010 + Cmake + Qt4.8 简单的环境搭建实例。
- 创建单实例的两种方法
- Thread(线程间通讯,等待唤醒机制)
- Binary String Matching
- string 类的实现
- 先序和中序建立二叉树
- jQuery.form.js进行表单提交,中文乱码问题及解决
- Qt4.8单实例启动的一种方法
- 项目软件编程下载地址
- Eliminate the application levels, a new concept on equipment/automation/Logistic control software 消除
- appium1.3.7的坑-Original error: Could not initialize ideviceinstaller; make sure it is installed ...
- HDU 4544 湫湫系列故事——消灭兔子
- 第三方支付
- iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)
- 用简单的方法做整套UI(教程第一/二/三弹合集)
- iOS开发工具——网络封包分析工具Charles