Parallelität in Modulen?

Hi,

ich möchte in meinem Modul mittels ReceiveText Daten von einem COM-Port empfangen. Funktioniert auch.

Das ganze würde ich zudem aber auch über einen PHP Befehl starten und das Ergebnis zurückliefern. Dies bedeutet aber, das die Delphi-Methode, welche zum PHP Kommando gehört, warten muss, bis die COM-Port Abarbeitung fertig ist. Das Modul muss also ReceiveText parallel zur PHP-Methode ausführen.

Geht das?

Gruss
Coyote

ja, solange die Gesamtlaufzeit im von PHP definierten Rahmen(max execution time) bleibt und parallel kein 2. Prozess versucht, auf die Schnittstelle zuzugreifen.

Tommi

Ich formuliere mein Problem nochmal genauer.

Ich habe im Modul eine Methode anlegt, die für den Aufruf via PHP Script vorgesehen, nennen wir sie mal WertAbfragen.

Für das Abfragen des Wertes von der Heizung muss ich über den Com-Port kommunizieren. Heisst: Ich muss ggf. mehrfach etwas mittels SendText absenden um mehrfach mittels ReceiveText die antworten zu verarbeiten. Am Ende steht dann ein Wert, den WertAbfragen an PHP zurückliefern soll.

Praktisch läuft also die ReceiveText-Methode „parallel“ (da unabhängig von IPS angespruchen) zur eigentlichen „WertAbfragen“-Methode.

Wenn ich jetzt z.B. in der WertAbfragen-Methode eine Do-Until Schleife einbauen würde, in der eine modul-interne Variable überprüft wird, würde ReceiveText dann weiterhin parallel abgearbeitet werden? Ich vermute mal, das die WertAbfragen-Methode in diesem Fall die Abarbeitung einer ReceiveText-Methode blockieren würde, da ja keine Parallelität programmiert wurde.

Ist meine Annahme richtig? Wenn ja, wie kann man es dann realisieren, so dass „WertAbfragen“ letztendlich den abgefragten Wert zurückliefert?

Alternativ würde ich zu „AktualisiereStatus“ übergehen, und Modul-Statusvariablen mit den Werten einführen.

Gruss
Coyote

ReceiveText wird immer parallel aufgerufen in einem seperaten Thread. d.h. du kannst das, was du vor hast, machen. Du darfst du nichts in ReceiveText einbauen, welches diese Methode blockiert. Ergo darf die do/while nicht in ReceiveText. Ich mache es intern übrigens nicht über do/while sondern über TEvent. Damit kannst du richtig bequem deine Daten abarbeiten und synchronisieren. Event.Wait(…) in WertAbfragen und Event.SetEvent in ReceiveText, wenn Daten da sind. Dann das ganze bitte noch über TCriticalSection ThreadSafe machen.

paresy