QProcess异步启动多个外部程序,并随主程序退出而关闭

目录

一、QProcess有三种调用方式

二、异步启用一个程序,随主程序退出而关闭

三、异步启动多个程序,均随主程序退出而关闭 


一、QProcess有三种调用方式

设置要运行的命令及参数arguments 
QString path = D:/manager.exe
QStringList arguments << D:/text.txt

1.同步调用,阻塞当前程序(如主程序不可点击)

execute()阻塞当前程序,直到外部程序退出

// 创建一个QProcess对象
QProcess process;

// 设置要运行的命令及参数arguments 
process.setProgram(path);
process.setArguments(arguments);

// 开始运行进程
process.start();
			
// 等待进程完成
if (process.waitForFinished(-1)) {
	qDebug() << "Process started successfully.";
}

2.异步调用,不会阻塞当前程序,但不会和主程序一起退出

start()不会阻塞当前程序执行

// 创建一个QProcess指针对象
QProcess *process = new QProcess();

// 异步启动外部程序,主程序退出 窗口仍在
process->start(path, arguments);

if (process ->waitForStarted())
	qDebug() << "外部程序启动finish。";
else 
	qDebug() << "外部程序启动error。";*/

3.分离调用,不会阻塞当前程序,但不会和主程序一起退出

startDetached()调用的程序和当前进程脱离关系独立运行

// 第一种方式 传参
bool started = QProcess::startDetached(path, arguments);

// 第二种方式直接启动程序 不需要传参
QProcess * process = new QProcess(this);
bool started = process->startDetached("C:\\Windows\\System32\\notepad.exe");

// 启动是否成功
if (started)
	qDebug() << "Process started successfully.";
else
	qDebug() << "Failed to start process";

二、异步启用一个程序,随主程序退出而关闭

设置全局指针对象 QProcess * m_process;

// 析构函数
ProcessWidget::~ProcessWidget()
{
	// 确保程序退出时关闭所有外部程序
	if (m_process) {
		if (!(m_process->state() == QProcess::NotRunning)) {
            // 将还在运行的程序杀死
			m_process->kill();
			m_process->waitForFinished(5000);
		}
		delete m_process;
		m_process= NULL;
	}
}

ProcessWidget::startProcess()
{
    // 传入参数
    QStringList arguments;
	arguments << "D:/text.txt";
	arguments << QString::number(2);
    // 外部程序绝对路径
	QString path = "D:/manager.exe";

    // 先置空 再使用
    if (m_process != NULL)
		delete m_process;

	m_process = new QProcess();
	// 异步启动外部程序
	m_process->start(path, arguments);
	
	if (m_process->waitForStarted())
		qDebug() << "外部程序启动finish。";
	else 
		qDebug() << "外部程序启动error。";*/
}

三、异步启动多个程序,均随主程序退出而关闭 

设置全局列表 QList<QProcess *> m_processes;

// 析构函数
ProcessWidget::~ProcessWidget()
{
	// 确保程序退出时关闭所有外部程序
	foreach(QProcess *process, m_processes) {
		if (process) {
			if (!(process->state() == QProcess::NotRunning)) {
				process->kill();
				process->waitForFinished(5000);
			}
			delete process;
			process = NULL;
		}
	}
}

// 启动外部程序
ProcessWidget::startProcess()
{
    // 没有运行则再启动
	bool isAgin = true;
	foreach(QProcess *process, m_processes) {
		if (process) {
			if (process->state() == QProcess::NotRunning) {
				// 异步启动外部程序
				process->start(path, arguments);
				if (!process->waitForStarted())
					qDebug() << "Process restarted failed.";
				isAgin = false;
				break;
			}
		}
	}

	// 没有/都运行 初始化new
	if (isAgin) {
		QProcess *process = new QProcess();
		m_processes.append(process);

		// 异步启动外部程序
		process->start(path, arguments);
	    if (!process->waitForStarted())
			qDebug() << "Process started failed.";
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值