flashfxp 上传网站,企业网站可以自己做,四川建设网电子招标,做网站 套模板 后端进程A#xff08;例如主程序#xff09;创建了一个QProcess B#xff0c;这个B就称为A的子进程#xff0c;而A称为B的父进程。
这也称为进程间通信#xff0c;有多种方式#xff1a;
TCP/IPLocal Server/Socket共享内存D-Bus #xff08;Unix库#xff09;QProcess会…进程A例如主程序创建了一个QProcess B这个B就称为A的子进程而A称为B的父进程。
这也称为进程间通信有多种方式
TCP/IPLocal Server/Socket共享内存D-Bus Unix库QProcess会话管理 这里因为是采用 QProcess创建的子进程所以接下来讲解的是该通信方式。 关于父进程读写子进程的数据主要是用到
子进程接收到了父进程数据两个信号会发射出来 void readyReadStandardError() void readyReadStandardOutput()
两个功能函数 QByteArray QProcess::readAllStandardError() QByteArray QProcess::readAllStandardOutput()
QProcess::write()发出信息 这个资料就太多了可以读我下面博客
关于QProcess的使用问题解释_我是标同学的博客-CSDN博客
qt qprocess获取控制台输出注意踩坑_qprocess获取输出_我是标同学的博客-CSDN博客
QProcess用cmd运行其它进程_我是标同学的博客-CSDN博客
QT打开外部程序并嵌入Qt子窗口的缺点_qt嵌入外部窗口_我是标同学的博客-CSDN博客
qt启动cmd再启动一个exe_qt调用可执行程序exe_我是标同学的博客-CSDN博客 关于子进程读写父进程的数据主要是用到 Windows中需要开启一个线程来管理stdin的文件变化这个需要使用Windows API函数linux中使用QSocketNotifier 监听 stdin文件当改文件有变化是读取信息
windows平台采用win的api阻塞式的读取
ReadFile(hStdinDup,chbuf,sizeof(chbuf),dwRead,NULL);//读取hstdinDup句柄文件中的数据
这个是阻塞函数类似控制台程序中的cin data或者gets()。
因此需要开启一个线程来管理stdin的文件变化函数中有涉及到while阻塞一直检测标准输入通道stdin是否有可读取的信息因此另开线程在pro文件中添加QT concurrent。实例代码如下
QFuturevoid fuQtConcurrent::run(this,Widget::readStdin);//开启一个线程void Widget::readStdin()//读取数据
{bool oktrue;char chbuf[1024];//缓存DWORD dwRead;//32位无符号整数HANDLE hStdinDup;//HANDLE 句柄类型const HANDLE hStdinGetStdHandle(STD_INPUT_HANDLE);//GetStdHandle获取标准输入的句柄if(hStdinINVALID_HANDLE_VALUE)//为无效句柄的话return;DuplicateHandle(GetCurrentProcess(),hStdin,GetCurrentProcess(),hStdinDup,0,false,DUPLICATE_SAME_ACCESS);//创建一个新句柄CloseHandle(hStdin);//关闭旧句柄while(ok){okReadFile(hStdinDup,chbuf,sizeof(chbuf),dwRead,NULL);//读取hstdinDup句柄文件中的数据emit sig_log(QLatin1String(ok is:)QString::number(ok));if(ok dwRead!0){emit sig_receivedCommand(QString::fromUtf8(chbuf,dwRead));//读取数据}}}linux平台QFile来读取标准输入
QProcess子进程通过QFile来读取标准输入来接收父进程信息。通过QFile绑定QSocketNotifier来接收标准输入的实时信号因为QSocketNotifier的activated信号可以通过标准输入是否有消息实时触发。
QProcess子进程通过QFile绑定标准输出stdout来发送消息给父进程。注意子进程读取信息不能通过QFile的readline等接口读取父进程信息因为QFile他会读取标准输入的所有信息并且不到长度就没有返回。哪怕QFile设置了读取长度也会在满足长度后才有消息返回我也不知为啥会这样。所有需要通过unstd.h的read接口来读取标准输入Linux中才有的函数。 m_file.open(stdin, QFile::ReadOnly); //stdin0 if (m_file.isOpen()) { m_clientsocket new QSocketNotifier(m_file.handle(), QSocketNotifier::Read,this); connect(m_clientsocket,SIGNAL(activated(int)),this,SLOT(slotreaddata(int))); }
void MainWindow::slotreaddata(int fd) { if(fd ! m_file.handle() ) return; char buf[128] {0}; read(fd,buf,sizeof(buf)); //不建议使用m_file.readLine(5)来读取返回值而是unistd.h的read接口来读取标准输入Linux中才有的函数。 m_readedit-append(QString::fromUtf8(接收消息%1).arg(buf));
} 参考博客
Qt 进程间通信_qt进程间通信_旷工锁的博客-CSDN博客
qt使用QProcess实现进程通信_qprocess父子进程_金色熊族的博客-CSDN博客