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

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

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

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

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

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

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

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

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

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

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

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

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

QByteArray QProcess::readAllStandardOutput()

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

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

QByteArray QProcess::readAllStandardError()

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

獲取進程信息

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

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

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

QString output = process.readAllStandardOutput();

當(dāng)具備了這個列表后,就可以根據(jù)冒號來逐行讀入并切割,通過循環(huán)的方式將其追加到treeWidget組件內(nèi),并以此來實現(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");

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

            // 確保至少有五個字段
            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() << "進程名稱" << "PID" << "會話名稱" << "Session"<< "內(nèi)存占用");
    } else
    {
        QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
        item->setText(0, "Failed to execute tasklist command.");
    }
}

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

使用此方法我們可以很好的讀取到系統(tǒng)中的各種信息,只要能夠合理的過濾出想要的字段即可,當(dāng)需要輸出系統(tǒng)信息時我們可以通過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();

     // 使用正確的文本編碼對輸出進行解碼
     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.");
    }
}

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

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

相關(guān)文章

最新評論

东乌| 金平| 溧水县| 榆树市| 高州市| 菏泽市| 泸西县| 岑巩县| 新安县| 岚皋县| 济源市| 北川| 牙克石市| 当雄县| 印江| 汉中市| 南昌市| 抚松县| 东至县| 长岛县| 房山区| 天津市| 荥阳市| 高碑店市| 巴塘县| 赤城县| 庆安县| 封开县| 内丘县| 买车| 阿鲁科尔沁旗| 平山县| 永胜县| 凌海市| 黄梅县| 高陵县| 广昌县| 北流市| 余干县| 长乐市| 格尔木市|