运行一个进程
使用类 QProcess,允许将一个进程堪称一个顺序IO设备。
在Qt中,QProcess类是用于启动外部进程的类。它可以启动任何可执行文件,包括命令行工具和图形用户界面(GUI)应用程序。
启动一个线程分4步
1、在 窗口 类中添加一个私有成员类 QProcess myProcess;
#include <QProcess>
...
namespace Ui {
class c;
}
class c : public QDialog
{
Q_OBJECT
public:
explicit c(QWidget *parent = nullptr);
~c();
QProcess myProcess;
private:
Ui::c *ui;
};
2、在 ui 中添加一个 button 按钮,然后添加信号槽。
3、信号槽中增加启动进程
void c::on_pushButton_clicked()
{
this->myProcess.start("xfce4-appfinder");
// You can optionally wait for the program to finish by calling waitForFinished()
// process->waitForFinished();
}
2 进程间通信
1、使用 TCP/IP
2、共享内存
3、 D-BUS
4、QProcess
5、会话管理
2.1 使用共享内存实现进程通信
1、使用QShareMemory 类,为其指定一个 key,拥有这个 key 就可以使用这个内存。
2、在 共享内存中加入数据loadFromFile();
:
- 进程和共享内存分离;
- 申请一个 QBuffer,将图像数据导入QBuffer
QString fileName = QFileDialog::getOpenFileName(0,QString(),QString(),"*.jpg");
QImage image;
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << image;
- 创建共享内存。使用create函数创建指定大小的共享内存段,单位是字节,该函数会自动将共享内存段连接到本进程。
int size =buffer.size();
sharedMemory.create(size);// 如果对其具有管理权限,每次都可创建,会删除旧的数据。
- 对内存进行加锁。然后使用memcpy 进行数据拷贝。完成后解锁。数据加载到内存完成。
sharedMemory.lock();
char *to = (char *)sharedMemory.data();
const char * from = buffer.data().data();
memcpy(to,from,qMin(sharedMemory.size(),size));
sharedMemory.unlock();
// sharedMemory.detach();如果现在断开了这个连接,因为没有其他人在使用这个对象,就会被释放掉,因此不应该断开连接。
3、从共享内存中读取数据LoadFromMemory();
- 和内存进行连接。
- 然后使用 QBuffer 进行读取,记得这个过程需要加锁和解锁。
- 进程和内存进行分离。
sharedMemory.attach());
QBuffer buffer;
QDataStream in(&buffer);
QImage image;
sharedMemory.lock();
buffer.setData((char *)sharedMemory.constData(),sharedMemory.size());
buffer.open(QBuffer::ReadOnly);
in >> image;
sharedMemory.unlock();
sharedMemory.detach();
我们启动两个程序,是两个进程。
左边的进程上运行:在 共享内存中加入数据loadFromFile();
;
右边的进程上运行:从共享内存中读取数据LoadFromMemory();
。
可以在2.2 的演示中看到效果。
需要注意的是,我们左边进程,如果运行LoadFromMemory();
,会导致共享内存直接被释放掉,就会导致右边的进程无法使用这个共享进程了。
如果把LoadFromMemory();
中释放内存的代码删除,会导致,两个进程都不释放共享内存。在左边进程想更新这个内存sharedMemory.create(size);
时可能会报错。
需要设计这个状态机过程,起始还是有点琐碎的。
2.2 演示
代码仓库
https://gitee.com/hiyanyx/qt5.14-cpp_dds_-project/tree/QTProcess
分支:QTProcess
参考
《Qt Creator快速入门_第三版__霍亚飞编著.pdf》