Zwei Instanzen eines Programms: Chaos
-
Und wieder ich.
Ich habe einen Fahrstuhl programmiert.
Dieser besteht aus einer Hauptklasse. In dieser Klasse werden Objekte zu diversen Threads angelegt und ein Objekt einer Interface Klasse. Die Hauptklasse wird in einem Formular erzeugt.
Es existieren also folgende Objekte:
Form gehört zur Applikation (Standard Formular Anwendung)
In Form existiert die Aufzug Klasse.
Die Aufzug Klasse hat in sich nun:
Türthread
Steuerungsthread
Anforderungsthread oben
Anforderungsthread unten
Simulationsthread Fahre
Simulationsthread Tür
Interface Klasseund ein Objekt mit der Adresse des Formulars.
Jeder der Threads besitzt eine Variable mit der Adresse der Interface Klasse.
Das Formular hat auch die Adresse des Interfaces.
Die Interface Klasse hat die ADressen aller Threads und des Formulars.Der Tür Thread ist eine State Machine. OFFEN, ÖFFNE, SCHLIESSE, GeSCHLOSSEN. Er ist also nur für die Tür verantwortlich.
Der Steuerungsthread steuert eben. Checkt ob Anforderungen vorhanden sind, ob die Tür offen oder zu ist, er kümmert sich um die Fahrt, setzt die Anforderungen bei Ankunft zurück.
Die Anforderungsthreads sind quasi die Knöpfe. Ist der Knopf gedrückt worden wird angefordert.
Die SImulationsthreads kümmern sich lediglich um eine grafische Darstellung der Türen und des Fahrstuhls. Soll heissen die ändern über for schleifen die Position von Shapes, die den Fahrstuhl darstellen.Die Kommunikation erfolgt über die MEssage Handler der Threads. ABER über die Interface Klasse.
Beispiel: Der Controller sagt der Tür bescheid mach mal auf. Er ruft also eine Funktion (Spread_Intern) im Interface auf und schickt sein Handle mit und eine Nachricht als Integer Wert. In der Funktion sind If Entschiedungen, die nun nach Sender ID und Nachricht eine bestimmte Reaktion auslösen. Hier ist das nun ein PostMEssage Befehl. Also in dem Falle jetzt führen die If Entscheidungen in Spread_Intern nun auf den Befehl PostMessage(türthread->handle, MSG_ÖFFNE). Es wird also eine Nachricht an die Message Queue des Türthreads geschickt. Der schläft gerade mit dem Befegl GetMessage. Empfängt die also und wertet sie aus... Dann kommt unter Umständen vom Türthread ein Spread_Intern Aufruf an einen der anderen Threads.
Lediglich die Kommunikation an den Steuerungsthread ist mit Events und Acquire/Release gelöst. Aber auch über diese Funktion.Weiterhin gibt es auch zwei Funktionen die dann über das gleiche System von IF Abfragen beispielsweise ein form->CheckBoxOPEN->checked=true; durchführen.
Soweit zum groben Aufbau... Jetzt mein Problem... Habe ich zwei Instanzen laufen so bringen die sich gegenseitig durcheinander. Beispielsweise fährt einer gerade runter, der andere öffnet und was passiert? Der der runter fährt fängt an zu öffnen während des Fahrens.
Für mich ein Zeichen, daß die Kommunikation kreuz und quer läuft.Aber WARUM???? Ich spreche doch gezielt Objekte an??? Die sind mit new angelegt. Also hat doch bei zwei Instanzen jedes Objekt seinen eigenen Speicherbereich???
PostMessage geht doch auch an die Handles der Threads. Die sollten doch auch einzigartig sein?
Ich hab absolut keine Idee wo sich die beiden Instanzen dann ins Gehege kommen...Die MEssages sind mit WM_USER + x über defines definiert. Aber sogar hier hab ich das Programm mit unterschiedlichen xen kompiliert. Das eine hatte 1-40 das Zweite 1001-1040...
-
Hallo
Da blickt wohl keiner von uns richtig durch, ohne deinen ganzen Code zu kennen.
Also benutzt den Debugger und manuelles ogging um den Verlauf und die wichtigen Variablen/Speicheradressen zu verfolgen.bis bald
akari