zoukankan      html  css  js  c++  java
  • Qt中的进程和线程

    一:启动一个进程:

    (1):进程的概述:在设计应用程序时,会在改程序中启动外部程序来配合完成工作,这时就需要启动外部进程,
        Qt应用程序可以很容易地启动一个外部应用进程,更重要地是QT提供了许多地进程间地通信地方法:
    (2):进程的类(QProcess):
      1:start()启动进程函数:将需要启动地进程名称和命令行参数作为该函数地参数。执行改函数后Qprocess进入starting状态,
       进入Running状态时就会发送started()信号。
      2:当进程退出地时候,Qprocess进入NotRunning状态,就会发送finished()信号。
      3:finished()信号:提供了进程地退出状态和退出代码,
      4:exitCode()函数:获取一个进程退出地代码。
      5:exitStatus()函数:获取进程退出地状态。
      6:error()函数:任何时间发生了错误,Qprocess都会发送error()信号。

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #include <QMainWindow>
    #include <QProcess> //线程类
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    public slots:
        void xianchen_clicked();//声明自定义槽函数.
    private slots:
        void on_btn1_clicked();
        void showResult();
    /*当槽函数对应地信号有参数时,对应地槽函数须设参数来接收槽函数地参数,他们地参数类型需要保持一致*/
        void showstate(QProcess::ProcessState);
        void showerror();
        void showfinshed(int,QProcess::ExitStatus);
    private:
        Ui::MainWindow *ui;
        QProcess myprocess;//实列化一个私有对象
    };
    #endif // MAINWINDOW_H

    main.cpp

    #include "mainwindow.h"
    #include <QApplication>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec(); /*循环*/
    }

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QPushButton>
    #include <QDebug>
    #include <QTextCodec> /*方便处理encoding*/
    MainWindow::MainWindow(QWidget *parent): QMainWindow(parent),ui(new Ui::MainWindow)
    {
        /*【注意】:这里采用代码地方式,没有使用ui来创建*/
        QPushButton *btn = new QPushButton(this);/*为什么这个按钮单击没有反应*/
        btn->setParent(this); //设置父对象
        btn->setText("启动一个按钮");
        ui->setupUi(this);
        this->setWindowTitle("启动一个外部线程");
        connect(btn,&QPushButton::clicked,this,&MainWindow::xianchen_clicked);
        connect(&myprocess,&QProcess::readyRead,this,&MainWindow::showResult);
     /*signal:
      * QProcess::stateChanged(QProcess::ProcessState newState)*/
        connect(&myprocess,&QProcess::stateChanged,this,&MainWindow::showstate);
        connect(&myprocess,&QProcess::errorOccurred,this,&MainWindow::showerror);
    /*1:对改信号和槽函数地解释
    *
    */
        connect(&myprocess,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(showfinshed));
    }
    void MainWindow::xianchen_clicked()
    {
        myprocess.start("notepad.exe");//打开一个外部线程
    }
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    /*enum:枚举类型地定义,(将其作为函数参数)
     * enum QProcess::ExitStatus
     * This enum describes the different exit statuses of QProcess.
     0 : The process exited normally.
     1 :  The process crashed.
     * QProcess::ExitStatus exitstatus :枚举的实列
    */
    void MainWindow::showfinshed(int exitCode,QProcess::ExitStatus exitstatus)//exitstatue:枚举的实列
    {
        qDebug()<<"showfinished:"<<endl<<exitCode<<exitstatus<<endl;
    }
    void MainWindow::showerror() /*类成员函数地定义*/
    {
    /*errorString()获取错误信息,并将其显示*/
        qDebug()<<"make error"<<endl<<myprocess.errorString()<<endl;
    }
    void MainWindow::showstate(QProcess::ProcessState newState)
    {
        qDebug()<<"showstate"<<endl;
        if(newState==QProcess::NotRunning)
        {
            qDebug()<<"NotRunning"<<endl;
        }
        else if(newState==QProcess::Starting)
        {
            qDebug()<<"Starting"<<endl;
        }
        else
        {
            qDebug()<<"Running"<<endl;
        }
    }
    void MainWindow::showResult()
    {
    /*3:QTextCodec简介:进行编码转换,这样才能显示中文或其他语言
     *
     *
    */
        QTextCodec *codec = QTextCodec::codecForLocale();
        qDebug()<<"showResult"<<endl<<codec->toUnicode(myprocess.readAll());//readALl:读取所有运行结果
    }
    void MainWindow::on_btn1_clicked() //使用GUI转换到槽()方式创建.
    {
        QString program = "cmd.exe";
    /*2:QStringList:
     *
    */
         QStringList arguments;/*实列化一个对象*/
     /*&pause命令指定指令运行完后暂停*/
         arguments<<"/cdir&pause"; /*"<<"为其类中的操作符*/
         myprocess.start(program,arguments);/*将需要启动地进程名称和命令行参数作为该函数地参数*/
         myprocess.start("notepad.exe");//打开一个外部线程
    }

    二:进程间的会话:

    (1):进程通信中的阻塞:QProcess提供了一组函数,可以脱离事件循环来使用,他们会挂起调用的线程,直到确定的信号被发送。

    waitForStarted() //阻塞,直到进程启动。
    waitForReadyRead()//阻塞,直到当前读通道上有可读的数据;
    waitForBytesWritten()//阻塞,直到一个有效负载数据被写入到进程
    waitForFinished()//阻塞,直到进程结束。

    三:多线程:

  • 相关阅读:
    位运算技巧2
    如果函数的参数是一个指针,不要指望用该指针去申请动态内存
    位运算 技巧1
    野指针?空指针?
    面试题:位操作实现四则运算
    面试题:递归颠倒栈 与栈排序
    求一个数任意位的值及位数
    基数排序
    面试题:最长回文子串(即求对称字符串的最大长度 )
    数据结构之后缀数组suffix array
  • 原文地址:https://www.cnblogs.com/1314bjwg/p/12817441.html
Copyright © 2011-2022 走看看