Seite 1 von 1

datenaustausch zwischen prozessen

Verfasst: 16.05.2012 17:12
von delikanli_19_82
halle leute,

ich habe jetzt ziemlich lange im forum rumgeschaut und googelt, aber nichts gefunden, das mein problem irgendwie lösen könnte.

mein ziel ist eigentlich ganz einfach:

es gibt ein hauptprogramm das aus drei fenstern besteht. über dieses programm kann man über ein "menü-eintag" weitere fenster laden. diese "weiteren" fenster sind dabei immer dasselbe programm (also exe-datei). nun soll das hauptprogramm mit diesen weiteren fenstern kommunizieren können.

dazu verwende ich die environment-funktionen, die scheinen gerade zu diesem thema gemacht zu sein scheinen. das dumme ist nur, das die "weiteren"-fenster-programm nicht in der lage ist, ausschau nach weiteren anweisungen zu halten, die vom hauptprogramm kommen. nach pb-hilfe sollte es hiermit eigentlich gehen:

Code: Alles auswählen

 If ExamineEnvironmentVariables()
    While NextEnvironmentVariable()
      PrintN(EnvironmentVariableName() + " = " + EnvironmentVariableValue())
    Wend
  EndIf
außerdem müssen diese fenster dem hauptprogramm wieder eine statusmeldung zurück schicken. ich kann hier nicht das ganze code aufschreiben, weil es zu umfangreich ist.

ich wäre dankbar, wenn jemand mir einfach das folgende in einem beispiel aufzeigen und erklären könnte:

programm-a (hauptprogramm) und instanzen von programm-b

programm-a sendet eine instruktion zu einem der instanzen des programm-b. dazu schreibt er einmal die id-nummer des jeweiligen instanzes und die entsprechende aktionscode in zwei umgebungsvariablen.

alle instanzen des programm-b sollen in ihren hauptschleifen in einem timer untergebracht die verfügbaren umgebungsvariablen abchecken. werden diese zwei speziellen umgebungsvariablen ermittelt, so schaut jedes instanz zunächst nach der id. die instanz, dessen id angegeben ist, ließt die aktion aus und tätigt diesen und entleert beide umgebungsvariablen wieder. die anderen instanzen ignorieren die aktion und halten weiter ausschau.

hilfe.... :-)

Re: datenaustausch zwischen prozessen

Verfasst: 16.05.2012 18:22
von RSBasic
Am Anfang sagst du, es ist nur ein einziges Programm, welches ausgeführt wird. Aber etwas dadrunter erzählst du von mehreren Programm-Instanzen (programm-a, -b).
Daher habe ich nicht ganz verstanden, was du möchtest.

Wenn es wirklich nur eine Anwendung ist, dann mach es doch per Variable (lokal oder global, jenachdem).

Wenn mehrere Prozesse gestartet sind und du möchtest, dass Prozess A eine Anweisung an Prozess B senden soll, dann: http://www.purebasic.fr/german/viewtopi ... 16&t=24073

Re: datenaustausch zwischen prozessen

Verfasst: 16.05.2012 18:33
von delikanli_19_82
hallo RSBasic,

das ganze ist "theoretisch ein einziges Programm". dieser besteht aber aus zwei executables. einer ist das hauptprogramm-datei und die andere ist eine für formulareingaben. dieser zweite kann vom esten programm aus x-beliebig oft geladen werden, jedoch zwischen jedem kopie des zweiten-programms und dem dem hauptprogramm muss eine reibungslose kommunikation laufen, da das zweite programme seine aufgaben durch das erste programm erhält und den resultat wieder an das hauptprogramm sendet.

stell dir vor, du hast ein hauptprogramm-fenster mit menüs für unterschiedliche funktionen. dieses hauptprogramm verbindet zu einer datenbank. das zweite programm wird vom ersten programm je nach bedarf mit einem parameter geladen und zeigt dem anwender ein entsprechendes formular für eingeben. der anwender tippt ein und will speichern. das formular-programm sendet dem hauptprogramm das es was zum speichern gibt und sendet ihm die daten mittels umgebungsvariablen und dieser schreibt die daten in eine datenbank.

das ist nur ein sehr einfaches beispiel, das programm macht eine menge mehr als nur mit nem datenbank rumzuhantieren. aber von diesem "formular-programme" sind noch weitere für unterschiedliche aufgaben zu verwendende varianten in planung. aber eben die kommunkikation von a nach b und b nach a muss ich erst hinbekommen, damit ich weitermachen kann.

ich hoffe konnte das bisschen verdeutlichen. ich schau mir gerade die links an.

Re: datenaustausch zwischen prozessen

Verfasst: 16.05.2012 18:38
von RSBasic
Danke für die nachträgliche Erklärung. Nun hab ich es verstanden. Dann ist der Link, den ich im letzten Satz geschickt habe, der richtige. In dem von mir verlinkten Thread sind viele Möglichkeiten vorhanden, wie du dafür sorgen kannst, dass Prozess A an Prozess B sendet und umgekehrt:
Such dir einfach die passende Lösung aus, die für dich am besten scheint.

Re: datenaustausch zwischen prozessen

Verfasst: 16.05.2012 18:58
von delikanli_19_82
hallo RSBasic,

erstmal danke für dein feedback.

mein program läuft dem mac. bis auf diese umgebungsvariable-methode sind die anderen dinge eher platformspäzisch.

die anwendung wird zwar im moment auf dem mac umgesetzt, soll aber auch nachträglich auf windows tauglich werden.

da bietet sich scheinheilig nach wie vor die sache mit den umgebungsvariablen oder clipboard. die idee mit dem clipboard finde ich persönlich nicht sehr sinnvoll, da er ja für andere dinge im eigentlichem sinne vorgesehen ist.

ich habe nun jetzt zwei extrem simple beispiele zusammengebastelt, um mein anliegen im code zu zeigen.

programm a:

Code: Alles auswählen

Global where.s = GetPathPart( ProgramFilename() )
If Right(where,1)<>"/":where+"/":EndIf

If OpenWindow(0,200,200,200,200,"Hauptprogramm")
  
  SetEnvironmentVariable("TEST_1_STRING","")
  SetEnvironmentVariable("TEST_2_STRING","")

  StringGadget( 0, 10, 10, 180, 24, "" )
  
  RunProgram(where+"test2")
  
  Repeat
    
    e = WaitWindowEvent()
    
    ExamineEnvironmentVariables()

    If e = #PB_Event_Gadget
      
      SetEnvironmentVariable("TEST_1_STRING",GetGadgetText(0))
      
    EndIf
    
    If GetEnvironmentVariable("TEST_2_STRING") <> ""
      SetWindowTitle( 0, GetEnvironmentVariable("TEST_2_STRING") )
      SetEnvironmentVariable("TEST_2_STRING","")
    EndIf
    
  Until e = #PB_Event_CloseWindow
  
  End
  
EndIf
und das unterprogram b:

Code: Alles auswählen

Global where.s = GetPathPart( ProgramFilename() )
If Right(where,1)<>"/":where+"/":EndIf

If OpenWindow(0,250,250,200,200,"Unterprogramm")
  
  StringGadget( 0, 10, 10, 180, 24, "" )
  StringGadget( 1, 10, 50, 180, 24, "" )
  
  Repeat
    
    e = WaitWindowEvent()
    
    ExamineEnvironmentVariables()

    If GetEnvironmentVariable("TEST_1_STRING") <> ""
      SetGadgetText( 0, GetEnvironmentVariable("TEST_1_STRING") )
      SetEnvironmentVariable("TEST_1_STRING","")
    EndIf
    
    If e = #PB_Event_Gadget And EventGadget() = 1
      
      SetEnvironmentVariable("TEST_2_STRING",GetGadgetText(1))
      
    EndIf
    
  Until e = #PB_Event_CloseWindow
  
  End
  
EndIf
in diesem extrem simplen beispiel soll beim eingeben im feld im hauptprogramm, das eingegebene text im unterprogramm feld 1 geschrieben werden.

wenn man im unterprogramm im feld 2 irgendwas eintippt, soll das in die titelleiste des hauptprogramms geschrieben werden.

eigentlich eine simple banale sache. echt bin doch etwas frustriert.

was mache ich hier eigentlich falsch?

natürlich müssen beide executables im selben ordner liegen. vorzugsweise im test1.app/Content/Macos.

Re: datenaustausch zwischen prozessen

Verfasst: 16.05.2012 19:07
von ts-soft
Environment Variablen kannst Du vergessen, da Erbt zwar jeder Process, lernt aber nicht dazu :mrgreen:
Crossplattform kannst Du es nur mit der Network-Library umsetzen (über den LokalHorst)

Re: datenaustausch zwischen prozessen

Verfasst: 16.05.2012 19:09
von delikanli_19_82
hmm....

dann weiß ich bescheid. danke für das info.