最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Qt開發(fā)之使用QProcess實(shí)現(xiàn)進(jìn)程管理

 更新時(shí)間:2024年03月22日 15:21:20   作者:lyshark  
Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,本文將重點(diǎn)介紹如何運(yùn)用QProcess組件實(shí)現(xiàn)針對(duì)進(jìn)程的控制管理等,感興趣的可以了解下

Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過(guò)拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹如何運(yùn)用QProcess組件實(shí)現(xiàn)針對(duì)進(jìn)程的控制管理等。

當(dāng)你在使用Qt進(jìn)行跨平臺(tái)應(yīng)用程序開發(fā)時(shí),經(jīng)常需要與外部進(jìn)程進(jìn)行交互,這時(shí)就可以利用Qt的QProcess模塊。QProcess模塊提供了啟動(dòng)和控制外部進(jìn)程的功能,能夠執(zhí)行外部命令、運(yùn)行其他可執(zhí)行文件,以及與外部進(jìn)程進(jìn)行通信。通過(guò)QProcess,可以方便地執(zhí)行命令行命令、調(diào)用系統(tǒng)工具、執(zhí)行腳本等。QProcess還可以捕獲外部進(jìn)程的輸出,以及監(jiān)視外部進(jìn)程的運(yùn)行狀態(tài),從而實(shí)現(xiàn)更靈活、高效的進(jìn)程管理。

以下是QProcess類的一些常用函數(shù)及其解釋的表格:

函數(shù)描述
start(const QString &program, const QStringList &arguments)啟動(dòng)一個(gè)新的進(jìn)程,program參數(shù)指定要執(zhí)行的程序,arguments參數(shù)指定傳遞給程序的參數(shù)列表。
startDetached(const QString &program, const QStringList &arguments)啟動(dòng)一個(gè)新的進(jìn)程,但不會(huì)等待進(jìn)程退出,也不會(huì)將輸出傳遞給調(diào)用進(jìn)程。
waitForStarted(int msecs = 30000)等待進(jìn)程啟動(dòng),如果在指定時(shí)間內(nèi)進(jìn)程沒有啟動(dòng),將返回false。
waitForFinished(int msecs = 30000)等待進(jìn)程退出,如果在指定時(shí)間內(nèi)進(jìn)程沒有退出,將返回false。
readAllStandardOutput()讀取進(jìn)程的標(biāo)準(zhǔn)輸出,并返回為QByteArray。
readAllStandardError()讀取進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出,并返回為QByteArray。
write(const QByteArray &data)向進(jìn)程的標(biāo)準(zhǔn)輸入寫入數(shù)據(jù)。
closeWriteChannel()關(guān)閉進(jìn)程的標(biāo)準(zhǔn)輸入。
kill()終止進(jìn)程。
terminate()終止進(jìn)程。
start(const QString &program)啟動(dòng)一個(gè)新的進(jìn)程,program參數(shù)指定要執(zhí)行的程序。
setWorkingDirectory(const QString &dir)設(shè)置進(jìn)程的工作目錄。
state()返回進(jìn)程的當(dāng)前狀態(tài)。
error()返回進(jìn)程的錯(cuò)誤狀態(tài)。
pid()返回進(jìn)程的進(jìn)程ID。
waitForBytesWritten(int msecs = 30000)等待寫入到進(jìn)程的數(shù)據(jù)已經(jīng)被完全寫入。
waitForReadyRead(int msecs = 30000)等待進(jìn)程有數(shù)據(jù)可讀。
startDetached(const QString &program)啟動(dòng)一個(gè)新的進(jìn)程,但不會(huì)等待進(jìn)程退出,也不會(huì)將輸出傳遞給調(diào)用進(jìn)程。
setProcessChannelMode(QProcess::ProcessChannelMode mode)設(shè)置進(jìn)程通信模式,可選值包括QProcess::SeparateChannels和QProcess::MergedChannels。

這些函數(shù)提供了控制進(jìn)程的各種方法,可以實(shí)現(xiàn)啟動(dòng)、監(jiān)視、控制和與外部進(jìn)程進(jìn)行交互的功能。

進(jìn)程控制模塊可以實(shí)現(xiàn)對(duì)特定進(jìn)程的啟動(dòng)關(guān)閉,本章將以執(zhí)行命令行為例,通過(guò)調(diào)用Start()可以拉起一個(gè)第三方進(jìn)程。

QProcess類的start()函數(shù)有幾種不同的重載形式,但最常用的是以下形式:

bool QProcess::start(
    const QString &program, 
    const QStringList &arguments, 
    QIODevice::OpenMode mode = ReadWrite
)

函數(shù)用于啟動(dòng)一個(gè)新的進(jìn)程,并執(zhí)行指定的程序(program參數(shù))。arguments參數(shù)指定了傳遞給程序的參數(shù)列表,它是一個(gè)QStringList類型的參數(shù),可以為空。mode參數(shù)指定了啟動(dòng)進(jìn)程時(shí)打開的模式,默認(rèn)為ReadWrite。函數(shù)返回一個(gè)bool類型的值,表示進(jìn)程是否成功啟動(dòng)。

當(dāng)調(diào)用start()執(zhí)行命令后,我們則可以通過(guò)readAllStandardOutput()函數(shù)從進(jìn)程的標(biāo)準(zhǔn)輸出中讀取所有可用的數(shù)據(jù),并將其返回為 QByteArray 對(duì)象。

QByteArray QProcess::readAllStandardOutput()

這個(gè)函數(shù)沒有參數(shù),它會(huì)立即返回當(dāng)前可用的標(biāo)準(zhǔn)輸出數(shù)據(jù),并將輸出數(shù)據(jù)作為字節(jié)數(shù)組返回。如果沒有可用的輸出數(shù)據(jù),它將返回一個(gè)空的字節(jié)數(shù)組。

當(dāng)然了,與之對(duì)應(yīng)的readAllStandardError()是函數(shù),該函數(shù)可以用于從進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出中讀取所有可用的數(shù)據(jù),并將其返回為 QByteArray 對(duì)象。

QByteArray QProcess::readAllStandardError()

該函數(shù)同樣沒有參數(shù),它會(huì)立即返回當(dāng)前可用的標(biāo)準(zhǔn)錯(cuò)誤輸出數(shù)據(jù),并將輸出數(shù)據(jù)作為字節(jié)數(shù)組返回。如果沒有可用的錯(cuò)誤輸出數(shù)據(jù),它將返回一個(gè)空的字節(jié)數(shù)組。

獲取進(jìn)程信息

此處我們以輸出系統(tǒng)進(jìn)程信息為例,通常可以調(diào)用tasklist /FO CSV來(lái)獲取系統(tǒng)中的進(jìn)程列表,并將其輸出為CSV格式,通過(guò)調(diào)用如下函數(shù)則可以獲取到系統(tǒng)進(jìn)程信息。

process.start("tasklist", QStringList() << "/FO" << "CSV");

此時(shí)通過(guò)調(diào)用readAllStandardOutput函數(shù)我們可以將緩沖區(qū)內(nèi)的數(shù)據(jù)讀出并將其放入到一個(gè)QString類型變量?jī)?nèi);

QString output = process.readAllStandardOutput();

當(dāng)具備了這個(gè)列表后,就可以根據(jù)冒號(hào)來(lái)逐行讀入并切割,通過(guò)循環(huán)的方式將其追加到treeWidget組件內(nèi),并以此來(lái)實(shí)現(xiàn)展示的效果;

void MainWindow::on_pushButton_clicked()
{
    CallProcess();

    ui->treeWidget->clear();

    QProcess process;
    process.start("tasklist", QStringList() << "/FO" << "CSV");

    if (process.waitForFinished())
    {
        QString output = process.readAllStandardOutput();
        output.replace("\"", "");

        QStringList lines = output.split("\n");

        // 跳過(guò)第一行標(biāo)題
        for(int i = 1; i < lines.size(); ++i)
        {
            QStringList fields = lines[i].split(",");

            // 確保至少有五個(gè)字段
            if(fields.size() >= 5)
            {
                QStringList rowData;
                for(int j = 0; j < 5; ++j)
                {
                    rowData << fields[j].trimmed();
                }
                ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(rowData));
            }
        }

        // 設(shè)置列標(biāo)題
        ui->treeWidget->setHeaderLabels(QStringList() << "進(jìn)程名稱" << "PID" << "會(huì)話名稱" << "Session"<< "內(nèi)存占用");
    } else
    {
        QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
        item->setText(0, "Failed to execute tasklist command.");
    }
}

運(yùn)行后當(dāng)點(diǎn)擊輸出系統(tǒng)進(jìn)程時(shí)則可以看到完整的進(jìn)程輸出效果,如下圖所示;

使用此方法我們可以很好的讀取到系統(tǒng)中的各種信息,只要能夠合理的過(guò)濾出想要的字段即可,當(dāng)需要輸出系統(tǒng)信息時(shí)我們可以通過(guò)process.start("systeminfo")調(diào)用系統(tǒng)命令獲取到,如下代碼所示;

void MainWindow::on_pushButton_2_clicked()
{
    ui->treeWidget->clear();

    // 獲取系統(tǒng)信息
    QProcess process;
    process.start("systeminfo");

    if (process.waitForFinished())
    {
     QByteArray output = process.readAllStandardOutput();

     // 使用正確的文本編碼對(duì)輸出進(jìn)行解碼
     QTextCodec *codec = QTextCodec::codecForName("GBK");
     QString text = codec->toUnicode(output);

     QStringList lines = text.split("\n");
     for (const QString &line : lines)
     {
         // 解析系統(tǒng)信息,添加到 QTreeWidget 中
         QStringList fields = line.split(":", Qt::SkipEmptyParts);
         if (fields.size() >= 2)
         {
             QString property = fields[0].trimmed();
             QString value = fields[1].trimmed();

             QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
             item->setText(0, property);
             item->setText(1, value);
         }
     }

     // 設(shè)置列標(biāo)題
     ui->treeWidget->setHeaderLabels(QStringList() << "系統(tǒng)信息" << "數(shù)值");
    } else
    {
     QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
     item->setText(0, "Failed to execute systeminfo command.");
    }
}

運(yùn)行后當(dāng)用戶點(diǎn)擊輸出系統(tǒng)信息按鈕時(shí),因systeminfo運(yùn)行時(shí)間較長(zhǎng)所以需要等待一段時(shí)間,輸出效果如下圖所示;

到此這篇關(guān)于C++ Qt開發(fā)之使用QProcess實(shí)現(xiàn)進(jìn)程管理的文章就介紹到這了,更多相關(guān)Qt QProcess進(jìn)程管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

来凤县| 太仆寺旗| 洛阳市| 青冈县| 泾源县| 和龙市| 河池市| 沾益县| 鹿邑县| 无极县| 库尔勒市| 子长县| 宝丰县| 和平区| 海安县| 榆中县| 卫辉市| 宜黄县| 福贡县| 泾川县| 黄浦区| 曲靖市| 疏附县| 乳源| 来安县| 饶平县| 仁布县| 景东| 安徽省| 惠东县| 镇赉县| 庆阳市| 吉安县| 苏尼特左旗| 加查县| 乐陵市| 满洲里市| 罗甸县| 枣阳市| 襄垣县| 观塘区|