進程間通信——共享內存

      網友投稿 735 2025-03-31

      接收端

      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小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:鏈接怎么搞(文檔在線鏈接怎么搞)
      下一篇:關于配色方案(十種配色方案)
      相關文章
      亚洲高清无在码在线电影不卡| 一本色道久久88综合亚洲精品高清| 亚洲一级特黄无码片| 亚洲av无码无线在线观看| 亚洲色偷偷色噜噜狠狠99网| 亚洲欧洲日韩不卡| 亚洲无删减国产精品一区| 亚洲精品人成在线观看| 亚洲av永久无码精品漫画| 国产成人无码综合亚洲日韩| 国产亚洲欧洲精品| 亚洲AV无码国产丝袜在线观看| 亚洲va久久久噜噜噜久久男同 | 亚洲AV成人影视在线观看 | 亚洲精品国产成人99久久| 亚洲AV永久无码精品成人| 亚洲av中文无码乱人伦在线播放| 亚洲毛片αv无线播放一区| 亚洲色中文字幕无码AV| 久久精品国产精品亚洲精品| 亚洲韩国精品无码一区二区三区| 国产亚洲色婷婷久久99精品| 国产av无码专区亚洲av桃花庵| 亚洲国产精品久久久天堂| 亚洲AV一宅男色影视| 亚洲人成电影在线天堂| 亚洲欧洲尹人香蕉综合| 亚洲av日韩av综合| 亚洲精品自偷自拍无码| 精品国产亚洲第一区二区三区 | 亚洲av无码成人精品区| 亚洲色图综合在线| 亚洲精品乱码久久久久久| 婷婷亚洲久悠悠色悠在线播放| 亚洲尹人香蕉网在线视颅| 亚洲国产成人在线视频| 亚洲人成网站在线在线观看| 亚洲AⅤ男人的天堂在线观看| 亚洲 无码 在线 专区| 国产精品亚洲视频| 亚洲成AV人片天堂网无码|