2011-01-13 17 views
2

Meine App wird verschiedene Aufgaben für verschiedene Aktionen haben.
Alle Aufgaben werden in FormCreate erstellt und in FormDestroy beendet. Sie werden immer ausgeführt, solange die Anwendung ausgeführt wird.
Der einzige Zweck des Hauptthreads besteht darin, Benutzer-E/A zu verarbeiten und Benutzereingaben an die entsprechende Aufgabe zu senden oder Aufgabeninformationen zu empfangen, die im Hauptformular angezeigt werden sollen.Ist es möglich, Nachrichten zwischen Aufgaben (OmniThreadLibrary) zu senden?

Es wird Daten geben, die zwischen Aufgaben übertragen werden müssen.
Beispiel:
Ich werde Aufgabe A tun Datenverarbeitung.
Es wird einige seiner Ergebnisse an den Haupt-Thread für die Anzeige senden.
Es muss auch einige (andere) Daten an Aufgabe B senden, die die Daten an einen anderen PC übertragen werden.
Task C empfängt einige Daten von einem Hardwaregerät und muss diese Daten zur Verarbeitung an Task A senden.
etc ...

Wie ich bisher verstehen, Nachrichten mit OmniThreadLibrary Senden immer zwischen der Aufgabe und dem Thread, der der Aufgabe (Haupt-Thread und Aufgabe A oder Haupt-Thread und Aufgabe B) erstellt.

Wie kann ich Nachrichten direkt zwischen zwei Aufgaben senden?

Oder gibt es irgendein Problem mit meinem Ansatz und es sollte komplett anders gemacht werden?

Antwort

6

Möglich. Sie müssen im Besitzer einen Kommunikationskanal anlegen und diesen beiden Aufgaben übergeben. In der Task rufen Sie dann Task.RegisterComm auf, um diesen Kommunikationskanal zu registrieren. Von diesem Zeitpunkt an werden alle Nachrichten, die auf diesem Kanal empfangen werden, unter Verwendung der Standard-OmniThreadLibrary-Mechanismen versandt (d. H. Genau so, als ob sie vom Eigentümer gesendet würden).

Siehe Demo 08_RegisterComm für ein Beispiel.

procedure TfrmTestRegisterComm.FormCreate(Sender: TObject); 
begin 
    FCommChannel := CreateTwoWayChannel(1024); 
    FClient1 := CreateTask(TCommTester.Create(FCommChannel.Endpoint1)) 
    .Run; 
    FClient2 := CreateTask(TCommTester.Create(FCommChannel.Endpoint2)) 
    .Run; 
end; 

function TCommTester.Initialize: boolean; 
begin 
    Task.RegisterComm(ctComm); 
    Result := true; 
end; 
Verwandte Themen