文档章节

Windows上的多线程管道通信

yushulx
 yushulx
发布于 2014/12/30 09:38
字数 248
阅读 1169
收藏 5

一个管道实际上就是一块共享内存,它有两端,分别用于两个进程的读写。这里介绍下如何在Windows上实现线程之间的管道通信。

参考原文:Multithreaded Pipe Communication on Windows

C#多线程管道通信

创建一个管道实例:

IntPtr pipe = PipeCommunication.Pipe.CreateNamedPipe(
                PIPE_NAME, 
                (uint)PipeCommunication.PipeOpenModeFlags.PIPE_ACCESS_DUPLEX, 
                (uint)(PipeCommunication.PipeModeFlags.PIPE_TYPE_BYTE | PipeCommunication.PipeModeFlags.PIPE_READMODE_BYTE),
                1, 512, 512, 0, IntPtr.Zero);

等待客户端连接:

PipeCommunication.Pipe.ConnectNamedPipe(pipe, ref nativeOverlapped);

客户端连接管道服务端:

IntPtr pipe = PipeCommunication.Pipe.CreateFile(
                PIPE_NAME,
                (uint)(PipeCommunication.DesireMode.GENERIC_READ | PipeCommunication.DesireMode.GENERIC_WRITE),
                0, IntPtr.Zero, 3, 128, IntPtr.Zero);

线程之间读写数据:

服务端

PipeCommunication.Pipe.WriteFile(pipe, bytes, (uint)(sizeof(byte) * bytes.Length), bytesWrittenOrRed, ref nativeOverlapped);
            try
            {
                while (value < 10)
                {
                    //omit to Clear bytes
                    PipeCommunication.Pipe.ReadFile(pipe, bytes, (uint)(sizeof(byte) * bytes.Length), bytesWrittenOrRed, ref nativeOverlapped);
                    value = BitConverter.ToInt32(bytes, 0);
                    value++;
                    bytes = BitConverter.GetBytes(value);
                    Thread.Sleep(300);
                    PipeCommunication.Pipe.WriteFile(pipe, bytes, (uint)(sizeof(byte) * bytes.Length), bytesWrittenOrRed, ref nativeOverlapped);
                }
            }

客户端

try
            {
                while (value < 10)
                {
                    //omit to Clear bytes
                    PipeCommunication.Pipe.ReadFile(pipe, bytes, (uint)(sizeof(byte) * bytes.Length), bytesWrittenOrRed, ref nativeOverlapped);
                    value = BitConverter.ToInt32(bytes, 0);
                    value++;
                    bytes = BitConverter.GetBytes(value);
                    Thread.Sleep(300);
                    PipeCommunication.Pipe.WriteFile(pipe, bytes, (uint)(sizeof(byte) * bytes.Length), bytesWrittenOrRed, ref nativeOverlapped);
                }
            }

源码

https://github.com/DynamsoftRD/windows-pipe-communication

git clone https://github.com/DynamsoftRD/windows-pipe-communication.git

参考

Pipes

本文转载自:http://www.codepool.biz/multithreading/multithreaded-pipe-communication-on-windows.html

yushulx
粉丝 28
博文 106
码字总数 60640
作品 0
杭州
私信 提问
System.IO之使用管道在进程间通信 (System.IO.Pipes使用)

管道的用途是在同一台机器上的进程之间通信,也可以在同一网络不同机器间通信。在.Net中可以使用匿名管道和命名管道。管道相关的类在System.IO.Pipes命名空间中。.Net中管道的本质是对windo...

长平狐
2012/06/08
159
0
使用命名管道在winform程序中输出windows service运行状态

最近的工作需要写一个windows服务,定时执行任务。众所周知windows service程序是没有用户界面的,而有时候是需要知道服务正在做什么的。怎么办呢?可否用winform程序显示服务执行状态呢?如...

长平狐
2012/06/08
236
0
MoreWindows博客目录(微软最有价值专家,原创技术文章152篇)

为了方便大家查找和学习,现将本人博客中所有博客文章列出目录。 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题讲解两大类 1. 《白话经典算法系列之一 冒泡排序的三种实现》 2. 《...

morewindows
2013/12/24
0
0
System.IO系列:局域网内多线程使用命名管道在进程之间通信实例

有关管道的基本用法请看System.IO之使用管道在进程间通信 (System.IO.Pipes使用)。 本文介绍命名管道使用实例,文中例子是几个客户端都通过一台服务器获得新生成的int类型id。 服务器端功能...

长平狐
2012/06/08
220
0
windows下进程间通信的手段有哪些?

作者:李志刚 纪玉波 程小茁 崔朝辉 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程...

长平狐
2012/09/20
147
0

没有更多内容

加载失败,请刷新页面

加载更多

ucos 中断,调度,互斥 分析

实际场景: 首先有个标志位 pps_flag,是一个全局变量。有两个地方会用到这个变量,一个是pps信号触发的外部中断,一个是ucos的任务。当pps信号触发外部中断的时候pps_flag被置为2,当任务里面...

青春无极限
15分钟前
1
0
spark streaming、flink和storm区别浅析

1. 介绍 这三个计算框架常常被拿来比较。从我的角度来看,三者的比较可以分为两类(mini-batches vs. streaming)。spark streaming属于微批量的伪流式准实时计算框架(spark本身属于批处理框架...

xiaomin0322
23分钟前
1
0
存储过程无参数,in,out ,in out 的用法

select * from scott.emp where empno=7839 or empno=7566 select * from emp5 create table emp5 as select * from scott.emp -----------------in create or replace procedure raisesalar......

颜丽
今天
2
0
SOFAJRaft-RheaKV 是如何使用 Raft 的 | SOFAJRaft 实现原理

SOFAStack Scalable Open Financial Architecture Stack 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 本文为《剖...

SOFAStack
今天
2
0
同一父类,不同子类集合可判断该元素组是否相等

判断集合是否相等时只关注元素是否相等,无需考虑类型,即同调父类AbstractList里的equal方法 源码如下: public boolean equals(Object o) { if (o == this) return true; if (!(o instance...

恋码之子
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部