qt怎么读取管道中的数据 麻烦给讲解下 谢谢

Jaimin_ 2014-06-28 12:06:02
我在按键响应的槽中 写了read,write函数读写管道 ,有是会卡死 是什么原因呢
...全文
564 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinaszkk 2014-07-03
  • 打赏
  • 举报
回复
引用 5 楼 yijimin 的回复:
[quote=引用 3 楼 chinaszkk 的回复:] 实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入。这都有可能引起你说的卡死,所以,写入函数在向内存中写入数据之前,检查1、内存中有足够的空间可容纳所有要写入的数据;2、内存没有被读程序锁定(这是内核中是实现的)。感觉在Qt里最好这些通信的都创建一个线程来执行。
多谢讲解 在问一下 管道创建完成后再次使用时需要重新创建吗?[/quote] 区分是无名管道还是有名管道了.无名管道肯定是要重新开的,有名管道其实就是开始时创建了一个管道文件,然后打开文件进行操作,这个创建以后,在次操作只要打开就行了。通信可以用QLocalServer和QLocalSocket,其实基本就是有名管道,或者QSharedMemory这个,共享内存,网上都有挺多文章的,一看就懂。
chinaszkk 2014-07-02
  • 打赏
  • 举报
回复
后者完全可以尝试下其他通信方式...
chinaszkk 2014-07-02
  • 打赏
  • 举报
回复
实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入。这都有可能引起你说的卡死,所以,写入函数在向内存中写入数据之前,检查1、内存中有足够的空间可容纳所有要写入的数据;2、内存没有被读程序锁定(这是内核中是实现的)。感觉在Qt里最好这些通信的都创建一个线程来执行。
Jaimin_ 2014-07-02
  • 打赏
  • 举报
回复
引用 3 楼 chinaszkk 的回复:
实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入。这都有可能引起你说的卡死,所以,写入函数在向内存中写入数据之前,检查1、内存中有足够的空间可容纳所有要写入的数据;2、内存没有被读程序锁定(这是内核中是实现的)。感觉在Qt里最好这些通信的都创建一个线程来执行。
多谢讲解 在问一下 管道创建完成后再次使用时需要重新创建吗?
max_min_ 2014-06-29
  • 打赏
  • 举报
回复
阻塞引起的还是怎么的?
Jaimin_ 2014-06-29
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
阻塞引起的还是怎么的?
具体原因也不清楚 这不想请教下 qt中是如何读写管道数据的呢 有什么要注意的吗?

16,247

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧