datenaustausch zwischen prozessen

Anfängerfragen zum Programmieren mit PureBasic.
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

datenaustausch zwischen prozessen

Beitrag 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.... :-)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: datenaustausch zwischen prozessen

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

Re: datenaustausch zwischen prozessen

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: datenaustausch zwischen prozessen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

Re: datenaustausch zwischen prozessen

Beitrag 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.
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

Re: datenaustausch zwischen prozessen

Beitrag 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)
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
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

Re: datenaustausch zwischen prozessen

Beitrag von delikanli_19_82 »

hmm....

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