2 programme variablen austauschen

Anfängerfragen zum Programmieren mit PureBasic.
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

hi danke für die ganzen posts...

@ ts-soft
so ganz verstehe ich das programm nicht... :(


@ all
mit RunProgram() geht das ja auch das die untereinander komunizieren. allerdings wird nicht beschrieben wofür die ganzen werte stehen...
kann mir wer sagen was die ganzen parameter machen?

vll geht es ja ganz einfach damit ^^

thx!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Brügge hat geschrieben: @ ts-soft
so ganz verstehe ich das programm nicht... :( !
Es wird ein gemeinsamer Memory erstellt, den habe ich strukturiert,
deswegen mußte leider dort mit pointern arbeiten.

Mit *Mem\Prog1 = "bla" oder *Mem\Prog2 = "blub" werden die Werte
gesetzt. Diese können von allen Programmen, die diesen globalen Mem mit
dem String reserviert haben, gelesen und beschrieben werden.
If *Mem\Prog1 = "bla"
tue dies
else
tue das
endif

Die Structure kannste an Deine bedürfnisse anpassen, müssen keine
Strings sein, long usw. sind auch möglich. Müssen aber in den versch.
Programmen gleich sein.

Die andere Lösung ist wohl komplizierter, hab aber noch nicht mit
gearbeitet.

Spiel doch einfach mal mit dem Source, wirste dann auch hintersteigen,
denke ich mal :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

1mom!!

wenn ich Global *Mem.test = PBOSL_AllocateMemoryGlobal("MeinGemeinsamerSpeicher", SizeOf(test))
in das andere programm schreibe kann der also auf den memory bereich drauf zugreifen??

oder wie sage ich dem anderen programm wo es die daten herholt?
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

achja nochwas

wenn ich mit dem einen programm etwas hereinschriebe und gleichzeitig mit dem anderen etwas heraushole kommt dann ein error? oder wie geht das?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Brügge hat geschrieben: wenn ich Global *Mem.test = PBOSL_AllocateMemoryGlobal("MeinGemeinsamerSpeicher", SizeOf(test))
in das andere programm schreibe kann der also auf den memory bereich drauf zugreifen??
Ja, jedes Programm das auf diese Art und mit diesem String "MeinGemeinsamerSpeicher" (besser ändern) Speicher allokiert, kann darauf zugreifen!
Brügge hat geschrieben: oder wie sage ich dem anderen programm wo es die daten herholt?
Das ist in jedem Programm gleich. Vielleicht sollte Programm 1 *mem\Prog1 lesen und *mem\Prog2 schreiben, und Programm 2 umgekehrt :wink:
Das da nichts durcheinander gerät, sollte Windows regeln.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

habe jetzt ein bisschen mit deinen programm rumgefuchtel es geht!!!!!

Du hast meine LAN gerettet!!


THX!

MFG BRÜGGE
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Der einzige Nachteil ist, es wird kein Ereignis ausgelöst, wenn der Speicher
verändert wird. Mußt also regelmässig selber schecken was drinne steht, z.B.
mit einem Timer wie im Beispiel.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
P1TBULL
Beiträge: 51
Registriert: 18.03.2008 02:24

Beitrag von P1TBULL »

ts-soft hat geschrieben:Hab mal ein Beispiel mit GlobalMemory erstellt, IMHO das einfachste.

Code: Alles auswählen

Structure test
  Prog1.s{255}
  Prog2.s{255}
EndStructure

Global *Mem.test = PBOSL_AllocateMemoryGlobal("MeinGemeinsamerSpeicher", SizeOf(test))

Procedure TimeProc(hWnd.l, uMsg.l, idEvent.l, dwTime.l)
  Static MyVar.s
  If idEvent = 1
    If MyVar <> *Mem\Prog1
      MyVar = *Mem\Prog1
      Debug MyVar
    EndIf
  EndIf
EndProcedure

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "")
  SetTimer_(WindowID(0), 1, 1000, @TimeProc()); alle sekunde auf änderungen Testen
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 80, 30, "Random")
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
        Case #PB_Event_Gadget
          If EventGadget() = 0
            *Mem\Prog1 = "Test " + Str(Random(1000))
          EndIf
      EndSelect
    ForEver
  EndIf
EndIf
PBOSL_FreeMemoryGlobal(*Mem)
// Nachtrag:
2x mit externen Debugger starten, damit man es sieht
Hallo, soweit funktioniert alles bei mir. Leider weiß ich nicht wie groß die Variablen werden die ich mit AllocateMemoryGlobal im speicher ablegen will. Gibt es eine Möglichkeit die Größe variabel zu halten?

Ich geh doch mal davon aus dass die {255} für die Größe steht. Wenn ich das weglasse bekomme ich einen falschen Wert.


Mfg
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Vielleicht so:

Code: Alles auswählen

Structure test
  Changed1.l
  Size1.l
  *pData1.l
  Changed2.l
  Size2.l
  *pData2.l
EndStructure

Global *mem.test = PBOSL_AllocateMemoryGlobal("MeinGemeinsamerSpeicher", SizeOf(test))

Procedure PBOSL_ReAllocateMemoryGlobal(*mem, memstr.s, Size.l)
  If *mem : PBOSL_FreeMemoryGlobal(*mem) : EndIf
  ProcedureReturn PBOSL_AllocateMemoryGlobal(memstr, Size)
EndProcedure

Procedure TimeProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
  Static MyVar.s
  Protected i.l, s.s
  
  If idEvent = 1
    If *mem\Changed1
      s = "Random 1: "
      For i = 0 To *mem\Size1 - 1
        If i : s + ", " : EndIf
        s + Str(PeekL(*mem\pData1 + i * SizeOf(Long)))
      Next
      Debug s
      *mem\Changed1 = #False
    EndIf
    If *mem\Changed2
      s = "Random 2: "
      For i = 0 To *mem\Size2 - 1
        If i : s + ", " : EndIf
        s + Str(PeekL(*mem\pData2 + i * SizeOf(Long)))
      Next
      Debug s
      *mem\Changed2 = #False
    EndIf
  EndIf
EndProcedure

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "")
  SetTimer_(WindowID(0), 1, 1000, @TimeProc()); alle sekunde auf änderungen Testen
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 80, 30, "Random 1")
    ButtonGadget(1, 10, 50, 80, 30, "Random 2")
   
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
        Case #PB_Event_Gadget
          Select EventGadget() 
            Case 0
              r = Random(20) + 1
              *mem\Size1 = r
              *mem\pData1 = PBOSL_ReAllocateMemoryGlobal(*mem\pData1, "ntq dynamic memory 1", r * SizeOf(Long))
              While r
                r - 1
                PokeL(*mem\pData1 + r * SizeOf(Long), r)
              Wend
              *mem\Changed1 = #True
            Case 1
              r = Random(20) + 1
              *mem\Size2 = r
              *mem\pData2 = PBOSL_ReAllocateMemoryGlobal(*mem\pData1, "ntq dynamic memory 2", r * SizeOf(Long))
              While r
                r - 1
                PokeL(*mem\pData2 + r * SizeOf(Long), r)
              Wend
              *mem\Changed2 = #True
          EndSelect
      EndSelect
    ForEver
  EndIf
EndIf
PBOSL_FreeMemoryGlobal(*mem)
P1TBULL
Beiträge: 51
Registriert: 18.03.2008 02:24

Beitrag von P1TBULL »

Hallo,

erstmal danke für deine Antwort. Aber ich glaub ich stell mich ein bisschen dumm an :oops:

Also bei meiner Variable handelt es sich um einen String und da es sich um einen Text handelt der mit der Zeit größer wird weiß ich nicht wie ich das mit dieser Globalen Variable bzw. der Größenangabe machen soll.

Sorry das ich so oft nachfragen muss!

Greetz
Bild
Antworten