1. 程式人生 > >C#共享記憶體兩個程序軟體互相讀寫實現類

C#共享記憶體兩個程序軟體互相讀寫實現類

我在網上找了很多原始碼,沒有一個可以用2個程式實現互相讀寫的共享記憶體功能,一般只能單向傳遞,沒有任何意義,於是我自己封裝了一個類,但是看起來沒任何問題,就是不能共享,現在我把程式碼貼出來,請大神幫忙看看

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.Threading;
namespace Demo
{


    public class ShareMemory
    {
        private MemoryMappedFile mmf;
        public string MapName = "future";
        public int MaxSize = 10 * 1024 * 1024;
        private int m_nState = 0;
        private int nDataLen = 0;

        public ShareMemory()
        {

        }
        public void Create()
        {
            mmf = MemoryMappedFile.CreateOrOpen(MapName, MaxSize, MemoryMappedFileAccess.ReadWrite);
        }
        public void Open()
        {
            mmf = MemoryMappedFile.OpenExisting(MapName);
        }
        /// <summary>
        /// 解構函式
        /// </summary>
        ~ShareMemory()
        {
            mmf.Dispose();
        }

        ///讀資料
        public void Read(ref byte[] Data)
        {
            m_nState = 2;
            using (var stream = mmf.CreateViewStream(0, nDataLen)) //建立檔案記憶體檢視流 基於流的操作
            {
                var reader = new BinaryReader(stream);
                reader.Read(Data, 0,nDataLen);


            }
            m_nState = 0;
        }

        public void Clear()
        {
            m_nState = 3;

            using (var stream = mmf.CreateViewStream(0,MaxSize)) //建立檔案記憶體檢視流 基於流的操作
            {
                var writer = new BinaryWriter(stream);
                byte[] Data=new byte[MaxSize];
                writer.Write(Data, 0, MaxSize);
                nDataLen = 0;

            }

            m_nState = 0;
        }

        //將資料寫入共享記憶體中

        public void Write(byte[] Data)
        {
            m_nState = 1;

            using (var stream = mmf.CreateViewStream(0,Data.Length)) //建立檔案記憶體檢視流 基於流的操作
            {
                var writer = new BinaryWriter(stream);
                writer.Write(Data,0,Data.Length);
                nDataLen = Data.Length;

            }

            m_nState = 0;
        }
        public int GetDataLenth()
        {
            return nDataLen;
        }

        /// <summary>
        /// 0空閒,1寫,2讀,3清除中
        /// </summary>
        /// <returns></returns>
        public int GetState()
        {
            return m_nState;
        }
    }
}

相關推薦

C#共享記憶體程序軟體互相實現

我在網上找了很多原始碼,沒有一個可以用2個程式實現互相讀寫的共享記憶體功能,一般只能單向傳遞,沒有任何意義,於是我自己封裝了一個類,但是看起來沒任何問題,就是不能共享,現在我把程式碼貼出來,請大神幫忙看看 using System; using System.IO; using System

ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現程序間的通訊,而Pipe實現程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))

使用共享記憶體實現一個程序檔案,程序檔案

主要功能:讀取任意的檔案,大小不限(不超過共享記憶體設定的大小,一般為8k,但可手動重新設定,這已經很大了。),執行後兩個或多個讀程序可同時讀取該檔案並在終端列印。 要實現該功能,首先你得了解共享記憶體的搭建,有四個函式,分別為shmget,shmat,shmdt,shmc

今天剛學的c++,程序

日常#include<iostream>using namespace std;int main(){int a,b,sum;cin>>a>>b;sum=a+b;cout<<"a+b="<<sum<<endl;retu

C語言】【unix c程序通過訊息佇列實現程序間的通訊

send.c: #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>

LR中用C語言比較字符串變量

nat [] 變量 end put tar 字符串 init rmi 以下腳本,定義兩個一樣的字符數組,對比後,打印出result的值: Action() { int result; char string1[] = "We can see the st

C# 用 * 輸出等腰三角形組成的菱形

content tel append ext post cti ole pretty ret int temp = 0; int n = 5; for(int i=0;i<n;i++){ for(int j=0;j<n-i;j++){

C語言的第一程序 “hello world!”

配置 語言編程 tro 原創 span style col 計算機 環境 1,C語言的簡介 C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。

C++ 計算任意日期之間的天數

gpo start plain efault ediff include win sel put C++寫的一個計算兩個日期之間天數的小程序: [cpp] view plain copy #include <Windows.h>

python 求出ax*x + bx + c = 0的

import math def quadratic(a,b,c): num = (b*b/(4*a*a))-(c/a); num2=math.sqrt(num); num3= b/(2*a); res = num2-num3; res2 = -num2-num

java程式設計師學C#基本語法小時搞定(對比學習)

對於學習一門新的語言,關鍵是學習新語言和以前掌握的語言的區別,但是也不要讓以前語言的東西,固定了自己的思維模式,多看一下新的語言的程式設計思想。 1.引包   using System;java用import 2.建構函式和java語法相同 3.解構函式  &n

LInux系統中使用訊號量對程序中訪問同一資源互斥注意事項

對於同一個共享資源的訪問,在Linux系統應用程式設計中經常遇到,通過訊號量來保護共享資源,實現互斥非常重要,對於實現互斥一般有如下幾個步驟: (1):建立訊號量:呼叫 int semget(key_t key,int num,in

C語言將整形變數的值互換

題目要求 給定兩個整形變數的值,將兩個值的內容互換。 1.引入一個新的變數temp 程式碼如下: #include<stdio.h> #include<stdlib.h> int main() { int a=10; int b=20

C/C++ 結構體(日期間的天數)

題目描述 求兩個日期d1,d2之間相差的天數d2-d1。 輸入  輸入資料有若干組。每組資料一行,有六個整數,表示兩個日期d1,d2,格式為:年月日。 輸出  對於每一組資料,輸出兩個日期d1,d2之間相差的天數, 格式參照樣例輸出。 樣例輸入 2000 1 1

流水線之1乘法器實現S=a*b*c*d(指暫存器之間只有一個乘法器)

module cy4(input[3:0] a,b,c,d, input vld_in,//輸入有效指示訊號 input clk,rst_n, output reg[15:0] dout, output re

C 一句話判斷List T 是否相等

                沒有營養的水文一篇,呵呵~~假設有兩個List<T>物件 ,List1和List2,如下方法判斷兩個List是否相等List1.All(List2.Contains) && List1.Count == List2.Count           

EL c:if test="${ }" 資料比較大小 注意事項

數值比較大小時,有時會出現 無法比較的現象,所以 數值*1.0 就可以正常比較 <c:if test="${money*1.0 < 100*1.0 }"> </c:if>

C 原地交換變數的值

第一種方法,大家會藉助第三個變數來實現: 如:tmp=A;A=B;B=tmp; 這種方法需要藉助第三變數來實現; 第二種方法是利用加減法實現兩個變數的交換: 如:A=A+B;B=A-B;A=A-B; 但是 如果 A+B 超出 A的範圍 ,會引起溢位。 第三種方法是

linux的crontab裡面,保證最多執行一個程序/程序/多程序的解決方法

在linux的crontab裡面,保證最多執行一個程序/兩個程序/多個程序 這個多謝了老大的推薦。我解決了flock來解決crontab裡面,即使系統卡住,也最多執行兩個程序的問題。 flock 會去判斷根據一個鎖檔案去判斷程序有沒有在執行。如果在執行,後面的程序就得等待。 fl

hadoop叢集出現datanode節點互相排斥的情況解決

我明明配置了3個節點的datanode,但是在 http://mini2:50070/dfshealth.html#tab-overview 的管理介面了只看到兩天存活 Live Nodes 為 2, Dead Nodes 為 0 我想就算有一臺掛掉也