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()//阻塞,直到进程结束。

三:多线程:

猜你喜欢

转载自www.cnblogs.com/1314bjwg/p/12817441.html