Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von funkheld »

Hallo, guten Tag.

Wie kann ich bitte den Filemapempfänger auf Bereitschaft stellen , damit er nur Daten raus gibt wenn er vom Sender etwas empfangen hat? Der Sender sendet jetzt mal alle 400 ms.

Sender:

Code: Alles auswählen

XIncludeFile "filemap.pbi"

Global wert.l,text_e.s

*MemoryID = AllocateMemory(1024)

Define *MemoryID = FileMap::Create("MyMemory", 1024)

Enumeration
  #Window_0
  #Editor_0
EndEnumeration

OpenWindow(#Window_0,1000,200,420,500,"esp-webserver-http", #PB_Window_SystemMenu)
EditorGadget(#Editor_0, 10, 180, 300,280)

AddWindowTimer(#Window_0, 123, 400)

Repeat  
  Event = WaitWindowEvent(1)
  
  If Event = #PB_Event_Timer And EventTimer() = 123
    wert=wert+1
    PokeS(*MemoryID+10,Str(wert))
    PokeL(*MemoryID,#False)
  EndIf  
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect 
ForEver 

FileMap::Close(*MemoryID)
Empfänger:

Code: Alles auswählen

XIncludeFile "filemap.pbi"

Global text_e.s

Enumeration
  #Window_0
  #Editor_0
EndEnumeration

*MemoryID = AllocateMemory(1024)

Define *MemoryID = FileMap::Open("MyMemory")

OpenWindow(#Window_0,1000,200,420,500,"esp-webserver-http", #PB_Window_SystemMenu)
EditorGadget(#Editor_0, 10, 180, 300,280)

Repeat  
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect 
  ????????????????text_e + PeekS(*MemoryID+10)+Chr(10)
  ????????????????SetGadgetText(#Editor_0, text_e) 
  
 ForEver 
 FileMap::Close(*MemoryID)

Die filemap.pbi :

Code: Alles auswählen

DeclareModule FileMap
  Declare Create(Name.s, Size.i, Security = #False)
  Declare Open(Name.s)
  Declare Close(*Mem)
EndDeclareModule

Module FileMap
  Global NewMap hMap.i()
 
  Global SA.SECURITY_ATTRIBUTES
  Global pSD.SECURITY_DESCRIPTOR
  Global IsInitSecurity
 
  Procedure Create(Name.s, Size.i, Security = #False)  
    Protected handle, *mem
   
    If Security
      If Not IsInitSecurity
        If Not InitializeSecurityDescriptor_(@pSD, #SECURITY_DESCRIPTOR_REVISION)
          ProcedureReturn 0
        EndIf
        If Not SetSecurityDescriptorDacl_(@pSD, #True, #Null, #False)
          ProcedureReturn 0
        EndIf
        SA\nLength = SizeOf(SA)
        SA\lpSecurityDescriptor = @pSD
        SA\bInheritHandle = #True
        IsInitSecurity = #True
      EndIf
      handle = CreateFileMapping_(#INVALID_HANDLE_VALUE, @SA, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, Name)
    Else
      handle = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, Name)
    EndIf
   
    If handle
      *mem = MapViewOfFile_(handle, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
      hMap(Str(*mem)) = handle
      ProcedureReturn *mem
    EndIf   
  EndProcedure
 
  Procedure Open(Name.s)   
    Protected handle, *mem
   
    handle = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, Name)
    If handle
      *mem = MapViewOfFile_(handle, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
      hMap(Str(*mem)) = handle
      ProcedureReturn *mem
    EndIf
  EndProcedure
 
  Procedure Close(*Mem)
    Protected result
   
    UnmapViewOfFile_(*Mem)
    result = CloseHandle_(hMap(Str(*Mem)))
    DeleteMapElement(hMap(), Str(*Mem))
    ProcedureReturn result
  EndProcedure 
EndModule
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von Bisonte »

Eigentlich ganz einfach.

Man nehme eine Speicherstelle und schreibe dort eine 1 hinein.

Der Empfänger schaut in periodischen Abständen nach, ob sich in besagter Speicherstelle eine 1 befindet.
Wenn ja, dann wird aus der 1 eine 0 und der Empfänger gibt das Ergebnis aus.

Andersherum könnte man auch eine Windowsmessage per PostMessage_() an alle Fenster senden wenn ein Ergebnis
anliegt. Das wäre eigentlich die bessere Wahl.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von funkheld »

Hallo, danke für die Info.

Kannst du bitte einmal hilfe geben für das Postmessage in Purebasic?

Danke.
Gruss
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von RSBasic »

Was für Hilfe brauchst du denn? Möchtest du die Parameter wissen und wie man das umsetzt? Bild https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von funkheld »

Dieses schaff ich nicht in Purebasic umzusetzen mit Postmessage:

Hauptprogramm:

Code: Alles auswählen

  PostMessage(ZielFenster&, $1000, 0, 100)
Zielfenster:

Code: Alles auswählen

UserMessages $1000
WHILE ende&
   If %UMessage = $1000
     if &ulParam=100
	   print "test"
	 endif  
    endif	
endwhille
Danke.
Gruss
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von RSBasic »

WinAPI-Funktionen haben in PB immer ein _ am Ende. Also stattdessen so: PostMessage_(...
Und:
ZielFenster& Bild ZielFenster
ZielFenster ist eine Variable und enthält die Handle-Nummer des Zielfensters.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
xXRobo_CubeXx
Beiträge: 120
Registriert: 12.06.2015 16:08
Computerausstattung: Version 5.41 LTS
Wohnort: Wohnort
Kontaktdaten:

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von xXRobo_CubeXx »

Warum haben Winapi ein Untestrich eigendlich?
Version 5.41 LTS :)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von RSBasic »

Um zwischen PureBasic- und WinAPI-Funktionen zu unterscheiden. Und das finde ich sehr vorteilhaft.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von funkheld »

Eine Filemap für 4 Programme geht das? Oder muss für je 2 Programme (Send/Empfang) je eine Filemap vorhanden sein?

Danke.
Gruss
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Filemapempfänger soll auf Bereitschaft sein zum Empfang.

Beitrag von Imhotheb »

Vielleicht hilft dir auch das IPC Modul weiter.
Das Beispiel kannst du auch öfters starten. Möglicherweise ist auch eine "Named-Semaphore" etwas das dir hilft.
weil einfach einfach einfach ist ... mach' ich es anders
Antworten