qt 控制台程序如何实现自动化交互

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 控制台程序如何实现自动化交互相关的知识,希望对你有一定的参考价值。

参考技术A 可以做底层控制库包来实现。
在原生系统中重新开发,进行细化分割形成loop,采用分离交互式来保证数据下发可靠性。
为了实现控制指令对比,会直接跳转到上一操作中。

QT中同一个程序的可执行程序只能运行一个,如何实现?

同一个可执行程序,只能执行一个,当打开第二次时,显示该执行程序已经被打开,并返回。QT下如何实现软件唯一性检查。

在windows下互斥体有个唯一的key,通过key去创建互斥体,如果这个互斥体已经存在了,那么通过GetLastError能获取到这个信息,表示程序已经在运行了。互斥体还有个优点就是在程序关闭时,会自动释放掉!

#include "mainwindow.h"

#include <QApplication>

#include <windows.h>

int main(int argc, char *argv[])
QApplication a(argc, argv);
QString strKey = "mykey";
LPCWSTR wstrKey = strKey.toStdWString().c_str();
HANDLE hMetex = CreateMutex(NULL,FALSE,wstrKey);
if(GetLastError() == ERROR_ALREADY_EXISTS)
//如果互斥体存在,说明程序已经有实例在运行了,释放资源然后关闭本实例
if(hMetex)
CloseHandle(hMetex);
hMetex = NULL;

return -1;

MainWindow w;
w.show();
return a.exec();


参考技术A 您好,非常荣幸能在此回答您的问题。以下是我对此问题的部分见解,若有错误,欢迎指出。这种叫单例程序,实现方式非常多,简单的多就是通过在程序之外做一个标记,启动时检查这个标记,如果有就直接退出程序。
可以使用的方式有:
1、写注册表或者文件 缺点:程序异常退出会导致下次无法启动
2、使用操作系统原子变量,简单安全稳定
3、使用操作系统管道通信
4、重新制作一个专门的启动程序
5.、。。。
推荐第二种,一个函数即可解决问题。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!
参考技术B #ifdef _WIN32
#include <Windows.h>
#endif

#define DEF_NAME "exe name"
int main(int argc, char *argv[])

QApplication a(argc, argv);

MainWindow w;
#ifdef WIN32
CoInitialize(NULL);
QString name = DEF_NAME;
QSystemSemaphore sema(name,1,QSystemSemaphore::Open);
sema.acquire();// 在临界区操作共享内存 SharedMemory
QSharedMemory mem(QString("SystemObject_%1").arg(DEF_NAME));// 全局对象名
if (!mem.create(1))

// 如果全局对象已存在则退出
HWND hWnd = FindWindowA( "QWidget", DEF_NAME ); //需要调用一下SetWindowTextA(this->winId(),DEF_NAME); //windowsAPI 用于查找窗口
if(hWnd != NULL)

if( IsIconic( hWnd ) ) //是否最小化
ShowWindow( hWnd, SW_RESTORE );
SetForegroundWindow( hWnd );//最上层显示

else
//An instance has already been running.


sema.release();// 如果是 Unix 系统,会自动释放。
return 0;

sema.release();// 临界区
#endif

w.show();

return a.exec();

以上利用共享内存实现。
简单满足一下你的需求,还可以QLocalServer实现。

以上是关于qt 控制台程序如何实现自动化交互的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Perl 以编程方式控制交互式 Unix 应用程序?

使用 QProcess 为 c++ 控制台应用程序实现前端

在 Qt 控制台应用程序中读写 QProcess

如何连接两个程序(c++,qt)

如何使用多线程制作一个简单的 Qt 控制台应用程序?

如何在关闭 Qt 控制台应用程序之前运行我的析构函数?