一:启动一个进程:
(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()//阻塞,直到进程结束。
三:多线程: