关于管道通信和多线程应用 调试总结...
最近我做了一个Named Pipe 同学示例程序,在调试的过程中 遇到若干问题,现在简单总结一下 :
首先简单介绍一下,给予MFC 单文档应用程序,两个独立的小项目,暂且把这两个项目定义为 MASTER , 和SLAVE 每个项目中各自创建一个 命名管道,作为服务器端;再分别在客户端客户端创建打开对方的管道,接受连接,做握手通讯,表示管道连接成功。 然后Master 端发起命令,Slave端接受到命令,做定时发送数据,由Maser 端接收数据;
如下图 :
问题1. 管道在建立的时候 主管道句柄 被提前关闭了,导致后面管道发送数据失败..... 在Debug 版本下 用断点调试 看到“”MyPipe“ 管道句柄 值被更改。注意: 当刚创建完成 CreateNamedPipe ,就CloseHandle 管道句柄。 然后下一个 CreateEvent 的句柄地址 就是刚才关闭的管道句柄地址。 后面管道的ReadFile 读取Buffer 函数就会失败。
问题2: 当多线程下管道用定时器发送数据后,Host 接受数据后,通过SendMessage 发送数据到数据处理函数时,因这个函数直到返回程序才继续往下执行。 当发送的消息处理函数 要处理大量数据时候, 导致这个函数返回时间滞后,接受数据的管道会卡住,导致主线程阻塞.....! 注意: 接收数据函数 的处理尽量小,可以把它理解成中断程序,确保它尽量短。 如果需要大量的数据处理,可以在接收数据函数中 用 PostMessage 发送消息,由专用的处理函数去处理数据。。。
提示: 以我做的这个程序为例,我在Host 端接收到数据后,处理数据函数太大(构建了不少类的对象),
导致函数返回滞后,主线程阻塞。
程序的结构设计很重要,在设计之初,最好画出流程图,那些地方需要实时处理,那些地方需要处理大量数据等等!