欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

函數(shù)描述
start(const QString &program, const QStringList &arguments)啟動一個新的進(jìn)程,program參數(shù)指定要執(zhí)行的程序,arguments參數(shù)指定傳遞給程序的參數(shù)列表。
startDetached(const QString &program, const QStringList &arguments)啟動一個新的進(jìn)程,但不會等待進(jìn)程退出,也不會將輸出傳遞給調(diào)用進(jìn)程。
waitForStarted(int msecs = 30000)等待進(jìn)程啟動,如果在指定時間內(nèi)進(jìn)程沒有啟動,將返回false。
waitForFinished(int msecs = 30000)等待進(jìn)程退出,如果在指定時間內(nèi)進(jìn)程沒有退出,將返回false。
readAllStandardOutput()讀取進(jìn)程的標(biāo)準(zhǔn)輸出,并返回為QByteArray。
readAllStandardError()讀取進(jìn)程的標(biāo)準(zhǔn)錯誤輸出,并返回為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)啟動一個新的進(jìn)程,program參數(shù)指定要執(zhí)行的程序。
setWorkingDirectory(const QString &dir)設(shè)置進(jìn)程的工作目錄。
state()返回進(jìn)程的當(dāng)前狀態(tài)。
error()返回進(jìn)程的錯誤狀態(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)啟動一個新的進(jìn)程,但不會等待進(jìn)程退出,也不會將輸出傳遞給調(diào)用進(jìn)程。
setProcessChannelMode(QProcess::ProcessChannelMode mode)設(shè)置進(jìn)程通信模式,可選值包括QProcess::SeparateChannels和QProcess::MergedChannels。

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

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

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

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

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

當(dāng)調(diào)用start()執(zhí)行命令后,我們則可以通過readAllStandardOutput()函數(shù)從進(jìn)程的標(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ù)可以用于從進(jìn)程的標(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ù)組。

獲取進(jìn)程信息

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

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() << "進(jìn)程名稱" << "PID" << "會話名稱" << "Session"<< "內(nèi)存占用");
    } else
    {
        QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
        item->setText(0, "Failed to execute tasklist command.");
    }
}

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

使用此方法我們可以很好的讀取到系統(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();

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

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

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

相關(guān)文章

  • C語言實現(xiàn)超市管理系統(tǒng)

    C語言實現(xiàn)超市管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件

    c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件

    這篇文章主要介紹了c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言簡易版flappy bird小游戲

    C語言簡易版flappy bird小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言簡易版flappy bird小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語言使用深度優(yōu)先搜索算法解決迷宮問題(堆棧)

    C語言使用深度優(yōu)先搜索算法解決迷宮問題(堆棧)

    這篇文章主要介紹了C語言使用深度優(yōu)先搜索算法解決迷宮問題,涉及C語言堆棧的使用與深度優(yōu)先算法解決迷宮問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • C++采用ring3讀取MBR實例

    C++采用ring3讀取MBR實例

    這篇文章主要介紹了C++采用ring3讀取MBR實例,可實現(xiàn)對硬盤的主引導(dǎo)記錄的讀取,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 如何獲取C++類成員虛函數(shù)地址的示例代碼

    如何獲取C++類成員虛函數(shù)地址的示例代碼

    這篇文章主要給大家介紹了關(guān)于C++如何獲取類成員虛函數(shù)地址的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • C語言中static和auto用法詳解

    C語言中static和auto用法詳解

    大家好,本篇文章主要講的是C語言中static和auto用法詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 深入單鏈表的快速排序詳解

    深入單鏈表的快速排序詳解

    本篇文章是對單鏈表的快速排序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)LeetCode(647.回文子字符串)

    C++實現(xiàn)LeetCode(647.回文子字符串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(647.回文子字符串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)系統(tǒng)關(guān)機注銷功能

    C語言實現(xiàn)系統(tǒng)關(guān)機注銷功能

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)系統(tǒng)關(guān)機注銷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論