• 11710阅读
  • 18回复

QT编写的基于内存共享方式的进程间通信 [复制链接]

上一主题 下一主题
离线xam786458276
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2017-02-28
亲测可用,请大神多多指教。
附件: ReadMemory.rar (5 K) 下载次数:120
附件: SharedMemory.rar (5 K) 下载次数:116
离线csgaokun

只看该作者 1楼 发表于: 2017-02-28
不能用,下资源下来是坏的,楼主是不是传错了
离线xam786458276

只看该作者 2楼 发表于: 2017-02-28
回 csgaokun 的帖子
csgaokun:不能用,下资源下来是坏的,楼主是不是传错了 (2017-02-28 13:54) 

把.user文件删掉试试,谢谢支持
离线stlcours

只看该作者 3楼 发表于: 2017-02-28
可用的,谢谢楼主了!之前我还专门发帖问过,但没人回答。

用法:
先运行 SharedMemory.exe,读取任意图片,为了验证是否真的好用,读取图片后,我把原图删掉了(改名也行)。
后运行 ReadMemory,点击按钮就能显示图片。

现在进程交互性的问题解决了,但是能不能稍微改造一下,让第二个instance运行的时候,激活第一个Instantce?也就是能不能第二个进程给第一个进程PostEvent?甚至是emit signal?说一下思路即可。
离线stlcours

只看该作者 4楼 发表于: 2017-02-28
查了一下,QSharedMemory没有自带任何信号。我的想法,能不能继承QSharedMemory,给它添加信号,然后两个进程里都使用这个继承类,这样它们最终使用的是同一个QSharedMemory Instance,就可以connect发信号了。

另外一种办法是,通过QSharedMemory把整个QApplication传递过去,这样又可以postEvent了。。。
离线kimtaikee

只看该作者 5楼 发表于: 2017-02-28
这不就是QtCreator自带的Demo吗?炒冷饭?

离线563255107

只看该作者 6楼 发表于: 2017-02-28
回 kimtaikee 的帖子
kimtaikee:这不就是QtCreator自带的Demo吗?炒冷饭? (2017-02-28 17:25) 

勇哥现身了,欢迎
离线圣域天子

只看该作者 7楼 发表于: 2017-03-01
我是直接用一个 .dll 或 .so ,对于复杂点的数据结构更好用。
离线timer3309

只看该作者 8楼 发表于: 2017-03-01
不用造轮子了。 建议关注 ZeroMQ 另一番天地为你敞开。
离线stlcours

只看该作者 9楼 发表于: 2017-03-03
回 圣域天子 的帖子
圣域天子:我是直接用一个 .dll 或 .so ,对于复杂点的数据结构更好用。 (2017-03-01 08:43) 

DLL不是被隔离的吗?你怎么使用?
离线stlcours

只看该作者 10楼 发表于: 2017-03-03
回 timer3309 的帖子
timer3309:不用造轮子了。 建议关注 ZeroMQ 另一番天地为你敞开。 (2017-03-01 23:22) 

怎么敞开?你确定是在回答楼主相似的问题?
离线圣域天子

只看该作者 11楼 发表于: 2017-03-03
回 stlcours 的帖子
stlcours:DLL不是被隔离的吗?你怎么使用? (2017-03-03 15:56)

实际还是互通的,具体看你怎么个用法了
离线stlcours

只看该作者 12楼 发表于: 2017-03-03
回 圣域天子 的帖子
圣域天子:实际还是互通的,具体看你怎么个用法了
 (2017-03-03 16:13) 

具体怎么用嘛,讲讲思路,或者贴点代码,谢谢~~
离线圣域天子

只看该作者 13楼 发表于: 2017-03-03
回 stlcours 的帖子
stlcours:具体怎么用嘛,讲讲思路,或者贴点代码,谢谢~~ (2017-03-03 16:48) 

实际上想想跟QShareMemory也差不多:

http://blog.csdn.net/mickeyty/article/details/51721860
离线stlcours

只看该作者 14楼 发表于: 2017-03-03
回 圣域天子 的帖子
圣域天子:实际上想想跟QShareMemory也差不多:
http://blog.csdn.net/mickeyty/article/details/51721860 (2017-03-03 16:55) 

高手,谢谢了。今天第一次知道还可以利用2~3G的地址空间,闻所未闻。
离线timer3309

只看该作者 15楼 发表于: 2017-03-25
补充一句,请私密我的朋友也看下。

用共享内存并不是做进程间通信的唯一办法。当然是有它的优势,但是接口太简单是硬伤。直接的问题是,数据是共享了,共享内容变化了,咋通知呢?QT 也有 qdbus 这样的模块,但是win下不能用,这。。。也有RPC之类的扩展库,没有发现好用的。

ZMQ虽然它只是一套消息库,但是因为可以直接嵌入式应用(类似sqlite相比于mysql),等于是直接为C++进程提供了通用的进程间消息机制,低开销,应用广泛。

特意提ZMQ 是推荐给想解决进程间通信的朋友们,一个我认为较为成熟的解决方法。如果进程间的消息比较多,复杂,还可以ZMQ+ protocolbuf 配合使用

以上,供各位开拓思路。


离线圣域天子

只看该作者 16楼 发表于: 2017-03-25
回 timer3309 的帖子
timer3309:补充一句,请私密我的朋友也看下。
用共享内存并不是做进程间通信的唯一办法。当然是有它的优势,但是接口太简单是硬伤。直接的问题是,数据是共享了,共享内容变化了,咋通知呢?QT 也有 qdbus 这样的模块,但是win下不能用,这。。。也有RPC之类的扩展库,没有发现好用的。
.. (2017-03-25 13:32) 

实现的方式有很多种,大家可以百花齐放。
我个人其实更常用QLocalServer & QLocalSocket,它完全类似网络接口,不同进程可以简单修改后变成基于网络的程序,而不仅仅限制在同一台机器上
离线stlcours

只看该作者 17楼 发表于: 2017-03-26
回 timer3309 的帖子
timer3309:补充一句,请私密我的朋友也看下。
用共享内存并不是做进程间通信的唯一办法。当然是有它的优势,但是接口太简单是硬伤。直接的问题是,数据是共享了,共享内容变化了,咋通知呢?QT 也有 qdbus 这样的模块,但是win下不能用,这。。。也有RPC之类的扩展库,没有发现好用的。
.. (2017-03-25 13:32) 

能给一个例子吗?最好是和QT相关的例子。
离线timer3309

只看该作者 18楼 发表于: 2017-03-26
基于信号-槽的扩展网络通信库的接口,直接的问题就是信号槽机制的处理性能不够好。在我的经验中,我们很少会依赖于信号槽去实现通信,即使我们用QT来开发我们的系统。以 QLocalServer 为例,需要简单修改本身就是一件可大可小的事情。在ZMQ中,可以做到,改改配置参数就好了,更灵活一些。

ZeroMQ的例子非常的简单,请感兴趣的翻翻书的前三章,应该就能用上了。

ZeroMQ,可以理解为以域套接字,socket 为底层支持,在应用层进行接口封装后的消息库,提供了相比使用Socket直接进行tcp udp 通信更加抽象的“”对象“”,比如:push-pull(消息推送), publish-sub(订阅发布) 以及 代理,路由,这些模式被集成在库中,不用自己再去“”创造性的使用socket“”进行进程通信了,库提供了常用的消息模式。

ZeroMQ 与 QT 没有必然的关系,所以我不能提供与QT相关的例子。你在C/C++中使用ZeroMQ 比使用QT更加轻量,而QT现在更像是C++的一种标准开发环境。另外就是ZeroMQ 有其它多种语言的绑定比如Java 等,因此在构建一个更加复杂的系统的时候,你可能必须跳开用QT才适合解决的问题,但ZMQ会成为一个像胶水一样的库,用来把你的系统粘成一个整体。

以上纯粹是个人经验,各位大牛见笑。使用不使用ZMQ做进程间通信,并不是一个多么了不得的问题,同样有很多C/C++的问题,ZMQ 搞不定或者搞的不太行。
快速回复
限100 字节
 
上一个 下一个