关闭

关于管道通信和多线程应用 调试总结...

标签: mfcNamedPipe
374人阅读 评论(0) 收藏 举报

关于管道通信和多线程应用 调试总结...


最近我做了一个Named Pipe 同学示例程序,在调试的过程中 遇到若干问题,现在简单总结一下 :


首先简单介绍一下,给予MFC 单文档应用程序,两个独立的小项目,暂且把这两个项目定义为 MASTER , 和SLAVE 每个项目中各自创建一个 命名管道,作为服务器端;再分别在客户端客户端创建打开对方的管道,接受连接,做握手通讯,表示管道连接成功。 然后Master 端发起命令,Slave端接受到命令,做定时发送数据,由Maser 端接收数据;

如下图 :




问题1.    管道在建立的时候 主管道句柄 被提前关闭了,导致后面管道发送数据失败..... 在Debug 版本下 用断点调试 看到“”MyPipe“ 管道句柄 值被更改。注意: 当刚创建完成 CreateNamedPipe ,就CloseHandle 管道句柄。 然后下一个 CreateEvent 的句柄地址 就是刚才关闭的管道句柄地址。 后面管道的ReadFile 读取Buffer 函数就会失败。  


问题2: 当多线程下管道用定时器发送数据后,Host 接受数据后,通过SendMessage 发送数据到数据处理函数时,因这个函数直到返回程序才继续往下执行。 当发送的消息处理函数 要处理大量数据时候, 导致这个函数返回时间滞后,接受数据的管道会卡住,导致主线程阻塞.....!   注意: 接收数据函数 的处理尽量小,可以把它理解成中断程序,确保它尽量短。 如果需要大量的数据处理,可以在接收数据函数中 用 PostMessage 发送消息,由专用的处理函数去处理数据。。。

提示: 以我做的这个程序为例,我在Host 端接收到数据后,处理数据函数太大(构建了不少类的对象),

                           导致函数返回滞后,主线程阻塞。

    程序的结构设计很重要,在设计之初,最好画出流程图,那些地方需要实时处理,那些地方需要处理大量数据等等!






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7036次
    • 积分:125
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:4篇
    • 译文:0篇
    • 评论:5条
    最新评论