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