2016-02-15 3 views
1

en utilisant MMF et C# I créait une mémoire partagée entre 2 processus.ipc utilisant Shared et comme MMF global

mon but est de le créer comme par exemple globale longueur 4000 octets et créer des partitions

si principal proj est « MainProj » commencera le MMF nommé "$AppName$_sharedMMF"

puis « Debugger Proj » accédera à ce "$AppName$_sharedMMF" de sorte que les positions accesseurs sont:

MainProj->Debugger : readAddr = 0 , writeAddr = 250 
Debbugger->MainProj : reafAddr = 250, writeAddr = 0 

alors le troisième exécutable dans ma solution sera

//setter getter 
MainProj->AnotherExe : readAddr = 251 , writeAddr = 500 

//setter getter 
EnotherExe->MainProj : reafAddr = 500, writeAddr = 251 

le problème que je suis confronté est maintenant que je voudrais le mainProj d'être une instance mondiale de MMF

donc chaque fois que je voudrais accéder aux partitions que je vais utiliser même classe statique et méthode

//accessed by main project 
SharedSetter(SelectedGetter, Data) 

1) comme il est partagé par plusieurs threads c'est un peu compliqué comme ça, bien que l'ajout de la partition ne soit pas supposé être compliqué comme le fait l'ensemble de l'installation, est-ce une mauvaise idée?

2) est-il vrai que je ne peux pas ignorer l'étape de création d'une nouvelle instance du MMF et la laisser "Alive" et créer uniquement de nouveaux accesseurs?

3) Quelqu'un a-t-il mis en œuvre la méthode?

Répondre

0
static void Main(string[] args) 
    { 
     FsMomitorIPCCarier data = new FsMomitorIPCCarier("someData"); 
     IpcAccessorSetting curSrv = new IpcAccessorSetting(IPChannelS.FsMonitor, IpcAccessorThreadNameS.FsmonitorThrd, 0, 2000); 
     MMFDepositT FsMonitorSetterDepo = null; 
     try 
     { 
      FsMonitorSetterDepo = new MMFDepositT(curSrv.Channel.ToString(),curSrv.AccThreadName.ToString(), 4096); 

      FsMonitorSetterDepo.ReadPosition = curSrv.AccessorSectorsSets.DepoSects.Setter.Read; 
      FsMonitorSetterDepo.WritePosition =curSrv.AccessorSectorsSets.DepoSects.Setter.Write; 
      Console.WriteLine("MonitorSetterDepo.ReadPosition " + FsMonitorSetterDepo.ReadPosition); 
      Console.WriteLine("MonitorSetterDepo.WritePosition " + FsMonitorSetterDepo.WritePosition); 

      FsMonitorSetterDepo.DataReceived += new EventHandler<MemoryMappedDataReceivedEventArgs>(FsMonitorSetter_DataReceived); 
      FsMonitorSetterDepo.StartReader(); 
     } 
     catch (Exception e) 
     { 
      Console.ForegroundColor = ConsoleColor.Red; 
      Console.WriteLine("MonitorSetterDepo ctor: " + e.Message); 
     } 

     Console.ForegroundColor = ConsoleColor.Magenta; 
     Console.WriteLine("MonitorSetterDepo is now online"); 

     var msg = data.DipositStrVal.StrValue.Val; 
     Console.WriteLine("Data = " + msg); 
     bool quit = false; 


     while (!quit) 
     { 
      Console.ReadLine(); 
      if (!string.IsNullOrEmpty(msg)) 
      { 
       var dataDelvr = data.IpcCarierToByteArray(); 
       FsMonitorSetterDepo.Write(dataDelvr); 
      } 
      else 
      { 
       quit = true; 
      } 
      //msg = ""; 
     } 

     //DepoTest.statusSet.ForEach(SttM => Console.WriteLine(SttM)); 

     FsMonitorSetterDepo.Close(); 
     FsMonitorSetterDepo = null; 

    }