进程间通信——共享内存

网友投稿 566 2022-05-29

接收端

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace WindowsFormsApp1

{

public partial class Form1 : Form

{

const int INVALID_HANDLE_VALUE = -1;

const int PAGE_READWRITE = 0x04;

[DllImport("User32.dll")]

private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

[DllImport("User32.dll")]

private static extern bool SetForegroundWindow(IntPtr hWnd);

//共享内存

[DllImport("Kernel32.dll", EntryPoint = "CreateFileMapping")]

private static extern IntPtr CreateFileMapping(IntPtr hFile, //HANDLE hFile,

UInt32 lpAttributes,//LPSECURITY_ATTRIBUTES lpAttributes, //0

UInt32 flProtect,//DWORD flProtect

UInt32 dwMaximumSizeHigh,//DWORD dwMaximumSizeHigh,

UInt32 dwMaximumSizeLow,//DWORD dwMaximumSizeLow,

string lpName//LPCTSTR lpName

);

[DllImport("Kernel32.dll", EntryPoint = "OpenFileMapping")]

private static extern IntPtr OpenFileMapping(

UInt32 dwDesiredAccess,//DWORD dwDesiredAccess,

int bInheritHandle,//BOOL bInheritHandle,

string lpName//LPCTSTR lpName

);

const int FILE_MAP_ALL_ACCESS = 0x0002;

const int FILE_MAP_WRITE = 0x0002;

[DllImport("Kernel32.dll", EntryPoint = "MapViewOfFile")]

private static extern IntPtr MapViewOfFile(

IntPtr hFileMappingObject,//HANDLE hFileMappingObject,

UInt32 dwDesiredAccess,//DWORD dwDesiredAccess

UInt32 dwFileOffsetHight,//DWORD dwFileOffsetHigh,

UInt32 dwFileOffsetLow,//DWORD dwFileOffsetLow,

UInt32 dwNumberOfBytesToMap//SIZE_T dwNumberOfBytesToMap

);

[DllImport("Kernel32.dll", EntryPoint = "UnmapViewOfFile")]

private static extern int UnmapViewOfFile(IntPtr lpBaseAddress);

[DllImport("Kernel32.dll", EntryPoint = "CloseHandle")]

private static extern int CloseHandle(IntPtr hObject);

private Semaphore m_Write; //可写的信号

private Semaphore m_Read; //可读的信号

private IntPtr handle; //文件句柄

private IntPtr addr; //共享内存地址

uint mapLength; //共享内存长

//线程用来读取数据

Thread threadRed;

public Form1()

{

InitializeComponent();

init();

}

///

/// 初始化共享内存数据 创建一个共享内存

///

private void init()

{

m_Write = new Semaphore(1, 1, "WriteMap");//开始的时候有一个可以写

m_Read = new Semaphore(0, 1, "ReadMap");//没有数据可读

mapLength = 1024;

IntPtr hFile = new IntPtr(INVALID_HANDLE_VALUE);

handle = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, mapLength, "shareMemory");

addr = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);

threadRed = new Thread(new ThreadStart(ThreadReceive));

threadRed.Start();

}

///

/// 线程启动从共享内存中获取数据信息

///

进程间通信——共享内存

private void ThreadReceive()

{

while (true)

{

try

{

//读取共享内存中的数据:

//是否有数据写过来

m_Read.WaitOne();

//IntPtr m_Sender = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);

byte[] byteStr = new byte[100];

byteCopy(byteStr, addr);

string str = Encoding.Default.GetString(byteStr, 0, byteStr.Length);

this.Invoke((MethodInvoker)(delegate ()

{ textBox1.Text = str.Trim(); })

);

/调用数据处理方法 处理读取到的数据

m_Write.Release();

}

catch (WaitHandleCannotBeOpenedException)

{

continue;

//Thread.Sleep(0);

}

}

}

//不安全的代码在项目生成的选项中选中允许不安全代码

static unsafe void byteCopy(byte[] dst, IntPtr src)

{

fixed (byte* pDst = dst)

{

byte* pdst = pDst;

byte* psrc = (byte*)src;

while ((*pdst++ = *psrc++) != '\0')

;

}

}

}

}

发送端

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace WindowsFormsApp2

{

public partial class Form1 : Form

{

const int INVALID_HANDLE_VALUE = -1;

const int PAGE_READWRITE = 0x04;

//共享内存

[DllImport("Kernel32.dll", EntryPoint = "CreateFileMapping")]

private static extern IntPtr CreateFileMapping(IntPtr hFile, //HANDLE hFile,

UInt32 lpAttributes,//LPSECURITY_ATTRIBUTES lpAttributes, //0

UInt32 flProtect,//DWORD flProtect

UInt32 dwMaximumSizeHigh,//DWORD dwMaximumSizeHigh,

UInt32 dwMaximumSizeLow,//DWORD dwMaximumSizeLow,

string lpName//LPCTSTR lpName

);

[DllImport("Kernel32.dll", EntryPoint = "OpenFileMapping")]

private static extern IntPtr OpenFileMapping(

UInt32 dwDesiredAccess,//DWORD dwDesiredAccess,

int bInheritHandle,//BOOL bInheritHandle,

string lpName//LPCTSTR lpName

);

const int FILE_MAP_ALL_ACCESS = 0x0002;

const int FILE_MAP_WRITE = 0x0002;

[DllImport("Kernel32.dll", EntryPoint = "MapViewOfFile")]

private static extern IntPtr MapViewOfFile(

IntPtr hFileMappingObject,//HANDLE hFileMappingObject,

UInt32 dwDesiredAccess,//DWORD dwDesiredAccess

UInt32 dwFileOffsetHight,//DWORD dwFileOffsetHigh,

UInt32 dwFileOffsetLow,//DWORD dwFileOffsetLow,

UInt32 dwNumberOfBytesToMap//SIZE_T dwNumberOfBytesToMap

);

[DllImport("Kernel32.dll", EntryPoint = "UnmapViewOfFile")]

private static extern int UnmapViewOfFile(IntPtr lpBaseAddress);

[DllImport("Kernel32.dll", EntryPoint = "CloseHandle")]

private static extern int CloseHandle(IntPtr hObject);

private Semaphore m_Write; //可写的信号

private Semaphore m_Read; //可读的信号

private IntPtr handle; //文件句柄

private IntPtr addr; //共享内存地址

uint mapLength; //共享内存长

Thread threadRed;

public Form1()

{

InitializeComponent();

//threadRed = new Thread(new ThreadStart(init));

//threadRed.Start();

mapLength = 1024;

}

private void button1_Click(object sender, EventArgs e)

{

try

{

m_Write = Semaphore.OpenExisting("WriteMap");

m_Read = Semaphore.OpenExisting("ReadMap");

handle = OpenFileMapping(FILE_MAP_WRITE, 0, "shareMemory");

addr = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);

m_Write.WaitOne();

byte[] sendStr = Encoding.Default.GetBytes(textBox1.Text.ToString() + '\0');

//如果要是超长的话,应另外处理,最好是分配足够的内存

if (sendStr.Length < mapLength)

Copy(sendStr, addr);

m_Read.Release();

}

catch (WaitHandleCannotBeOpenedException)

{

MessageBox.Show("不存在系统信号量!");

return;

}

}

static unsafe void Copy(byte[] byteSrc, IntPtr dst)

{

fixed (byte* pSrc = byteSrc)

{

byte* pDst = (byte*)dst;

byte* psrc = pSrc;

for (int i = 0; i < byteSrc.Length; i++)

{

*pDst = *psrc;

pDst++;

psrc++;

}

}

}

}

}

任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:鹰眼视图——《图样,too simple》系列之二
下一篇:【云驻共创】GDE.ADC API编排介绍及案例演示
相关文章