QT 根据名字 判断进程是否正在运行 (阻塞和非阻塞)

方法1 调用“tasklist”,检测是否包含进程名称。 缺点:可能会阻塞一小会儿,导致界面卡顿。 主要是在waitForFinished上阻塞, readAllStandardOutput也会有所耗时。

    QProcess tasklist;
    tasklist.start(
        "tasklist",
        QStringList() << "/NH" 
        << "/FO" << "CSV" 
        << "/FI" << QString("IMAGENAME eq 进程名称.exe"));

    if ( tasklist.waitForFinished() )
    {
        QByteArray result = tasklist.readAllStandardOutput();
        QString result1 = TOCH(result.constData());
        if (result1.contains("进程名称.exe", Qt::CaseInsensitive))
        {
            return true;
        }
    }
    else
    {// 失败
        qDebug() << "tasklist failed error=" 
            << tasklist.error() 
            << tasklist.errorString();
    }

方法二 代码繁琐 但是不卡界面。

    QProcess process;
    process.start("tasklist");

    bool bFinished = false; //进程是否结束
    bool bResult = false; //检测结果

    QObject::connect(&process,static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
        [&](int nExitCode, QProcess::ExitStatus exitStatus)
    {// 匿名函数 进程结束后会被调用
        if (nExitCode == 0)
        {
            QByteArray result = process.readAllStandardOutput();
            QString result1 = TOCH(result.constData());
            if (result1.contains("进程名称.exe", Qt::CaseInsensitive))
            {
                bResult  = true;
            }
        }

        bFinished = true; // 引用传值 这里改变值  外面的变量本身也会被改变
    });
 
    //启动进程
    process.start();

    QTimer t; 
    t.start(); 
    while(t.elapsed() < 250) 
    { // 在等待进程执行的过程中 处理界面事件 避免卡顿
        QCoreApplication::processEvents(); 
    } 

    process.disconnect(); // 保险起见 取消所有信号连接

    if (!bResult)
    {// todo
        
    }
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容