diff --git a/README.md b/README.md index 2c6976fb..805db77d 100644 --- a/README.md +++ b/README.md @@ -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的进程间通信实现。 ======================================================================== diff --git a/src/highgrade/network/qqtlocalserver.h b/src/highgrade/network/qqtlocalserver.h index 2c24a544..cb60480d 100644 --- a/src/highgrade/network/qqtlocalserver.h +++ b/src/highgrade/network/qqtlocalserver.h @@ -9,6 +9,8 @@ /** * @brief The QQtLocalServer class + * 把Pipe封装成了Socket的模样。 + * Server管理Pipe的创建和销毁,listen可以调用多次,但是相同的key只有开始的一次可以成功listen。 */ class QQTSHARED_EXPORT QQtLocalServer : public QLocalServer { diff --git a/src/highgrade/qqtnamedpipe.h b/src/highgrade/qqtnamedpipe.h index 734dfcb6..2d35a349 100644 --- a/src/highgrade/qqtnamedpipe.h +++ b/src/highgrade/qqtnamedpipe.h @@ -1,4 +1,110 @@ -#ifndef QQTNAMEDPIPE_H +#ifndef QQTNAMEDPIPE_H #define QQTNAMEDPIPE_H +#include +#include +#include +#include +#include + +/** + * @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 diff --git a/test/singletonapptest/main.cpp b/test/singletonapptest/main.cpp index 2834faf4..23e7042f 100644 --- a/test/singletonapptest/main.cpp +++ b/test/singletonapptest/main.cpp @@ -1,10 +1,15 @@ #include "mainwindow.h" #include +#include +#include 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(); diff --git a/usage.md b/usage.md index 1e558ad9..9c24ba46 100644 --- a/usage.md +++ b/usage.md @@ -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成功的样子。")