1
0
mirror of https://gitee.com/drabel/LibQQt.git synced 2025-01-04 10:18:44 +08:00

update namedpipe

This commit is contained in:
tianduanrui 2018-07-13 15:42:29 +08:00
parent f0e3f15929
commit 306fb2992c
5 changed files with 117 additions and 2 deletions

View File

@ -101,6 +101,7 @@ github link: https://github.com/AbelTian/LibQQt
- QQtSharedMemory实现可以跨线程的临时变量。
- QQtLocalServer QQtLocalClient, QQtNamedPipe使用QLocalSocket实现跨线程通讯。(**HighGrade**)
- QQtLocalQueueServer QQtLocalQueueClient QQtMessageQueue使用QQtLocalQueueSocket实现跨线程通讯。(**HighGrade**)
- 使用方法都类似于QQtSharedMemory。
- QQtSingleTonApplication 利用基于QLocalSocket的进程间通信实现。
========================================================================

View File

@ -9,6 +9,8 @@
/**
* @brief The QQtLocalServer class
* Pipe封装成了Socket的模样
* Server管理Pipe的创建和销毁listen可以调用多次key只有开始的一次可以成功listen
*/
class QQTSHARED_EXPORT QQtLocalServer : public QLocalServer
{

View File

@ -1,4 +1,110 @@
#ifndef QQTNAMEDPIPE_H
#ifndef QQTNAMEDPIPE_H
#define QQTNAMEDPIPE_H
#include <qqt-local.h>
#include <qqtcore.h>
#include <qqtmessage.h>
#include <qqtlocalclient.h>
#include <qqtlocalserver.h>
/**
* @brief The QQtNamedPipe class
* QSharedMemory使用方式使Pipe(QLocalSocket)
*/
class QQTSHARED_EXPORT QQtNamedPipe : public QQtLocalClient
{
Q_OBJECT
public:
explicit QQtNamedPipe ( const QString& key, QObject* parent = Q_NULLPTR ) : QQtLocalClient ( parent ) {
}
~QQtNamedPipe() {}
//需要重写,改变共享内存块大小。
virtual void initializer() {
//user set payload size.
//这个只需要调用一次但是调用多次也正常使用。我在这个教程父类里面给的是1024.子类可变可改。这个是最大约束,万万不能超过。
//create ( 1024 );
//这个每个变量都必须调用是这个函数保证data()指针有数的。
//attach();
}
//需要重写,实现把局部变量打包到共享内存块。(注释部分。)
//这个函数保证写入共享内存。
virtual void packer() {
//lock();
//user data struct
QByteArray bytes;
//bytes << a;
//这个是无论如何不应该发生的,用户在申请空间的时候应当申请足够的以供变动的空间。
if ( bytes.size() > size() ) {
pline() << "bytes size out payload..., create more...";
//unlock();
return;
}
//memcpy ( data(), bytes.constData(), bytes.size() );
//unlock();
}
//需要重写,实现把共享内存块解压到局部变量。(注释部分。)
//这个函数保证从共享内存读取。
virtual void parser() {
//lock();
QByteArray bytes;
bytes.resize ( size() );
//memcpy ( bytes.data(), data(), size() );
//user data struct
//bytes >> a;
//unlock();
}
/*以下函数提供操作方便。*/
QByteArray readShortString ( QByteArray& bytes ) {
quint16 s0;
QByteArray str;
bytes >> s0;
str.resize ( s0 );
bytes >> str;
return str;
}
void writeShortString ( QByteArray& bytes, QByteArray& shortString ) {
quint16 s0 = shortString.size();
bytes << s0;
bytes << shortString;
}
QByteArray readString ( QByteArray& bytes ) {
quint32 s0;
QByteArray str;
bytes >> s0;
str.resize ( s0 );
bytes >> str;
return str;
}
void writeString ( QByteArray& bytes, QByteArray& shortString ) {
quint32 s0 = shortString.size();
bytes << s0;
bytes << shortString;
}
signals:
public slots:
private:
/**
* example
* quint32 a;
* QByteArray b;
* quint8 c;
*/
};
#endif // QQTNAMEDPIPE_H

View File

@ -1,10 +1,15 @@
#include "mainwindow.h"
#include <qqtsingletonapplication.h>
#include <QLocalServer>
#include <QDebug>
int main ( int argc, char* argv[] )
{
QQtSingleTonApplication a ( argc, argv );
//QLocalServer::removeServer ( "QQtSingleTon" );
QLocalServer b;
qDebug() << "listen:?" << b.listen ( "QQtSingleTon" );
qDebug() << "listen:?" << b.isListening();
MainWindow w;
w.show();

View File

@ -198,7 +198,8 @@ LIB_SDK_ROOT=R:\Develop\d1-sdk
APP_BUILD_ROOT=R:\Develop\c0-buildstation
Multi-link目录里提供了Multi-linkConfigTool图形配置工具编译运行就可以设置非常方便。
在工程里包含multi-link/add_base_manager.pri在project build config设置环境变量QSYS就可以使用里面的丰富函数。简单吧
*注意Multi-link 2已经不支持Qt4如果需要Qt第四代那么使用multi-link 1.0链接QQt。*
*注意Multi-link 2 已经不支持Qt4如果需要Qt第四代那么使用multi-link 1.0链接QQt。*
*注意Multi-link 2 APP_BUILD_ROOT变成了optional但是依然需要设置一下以免还有需要的地方。build root是一切开始的地方。*
![qmake成功](screenshot/15.png "这是LibQQt qmake成功的样子。")
![qmake成功](screenshot/16.png "这是Example app qmake成功的样子。")