Inter-Thread-Kommunikation

Anknüpfend an den Artikel Multithreading – Parallelisierung und Nebenläufigkeit – der die Hintergrundverarbeitung unter Verwendung von Threads erläutert und bereits grundsätzliche Mechanismen zur Datenübergabe und zur Steuerung von Threads vorstellt – gehe ich in diesem Artikel auf eine weiterführende Möglichkeiten zur Kommunikation mit als Thread oder Prozess gestarteten Jobs ein: Der Austausch von MSX-Nachrichten.

Der Austausch von MSX-Nachrichten kann sowohl uni- als auch bidirektional erfolgen. Das bedeutet, dass eine Seite entweder nur Nachrichten versenden, nur Nachrichten empfangen oder aber sowohl Nachrichten versenden als auch empfangen kann. MSX-Nachrichten können dabei nicht nur zwischen dem Starter eines Jobs und dem Job, sondern auch zwischen zwei verschiedenen Jobs ausgetauscht werden.

Der Transport der Nachrichten ist über sogenannte Pipes gelöst. Sie ermöglichen einen sehr schnellen Datenaustausch ohne Latenzen.

Job starten

Die folgende Funktion startet einen Job als Thread und initiert eine bidirektionale Kommunikation, indem sie je einen Kanal zum Senden und Emfpangen von Nachrichten öffnet.

sub JobStartMSX
(
  var vMsxWrite         : handle; // Sendekanal
  var vMsxRead          : handle; // Empfangskanal
)
: handle;                         // Kontrollobjekt/Fehler
  local
  {
    tJobID              : int;
    tJob                : handle;
    tErr                : int;
  }
{
  // Job starten
  tJobID # JobStart(_JobThread, 5, __PROC__ + ':' + 'JobMSX');
  if (tJobID > 0)
  {
    // Kontrollobjekt öffnen
    tJob # JobOpen(tJobID);
    if (tJob > 0)
    {
      // Sendekanal öffnen
      vMsxWrite # MsxOpen(_MsxThread | _MsxWrite, tJob);
      // Empfangskanal öffnen
      vMsxRead # MsxOpen(_MsxThread | _MsxRead, tJob);
    }
    else
      tErr # tJob;
  }
  else
    tErr # tJobID;
  // Kein Fehler aufgetreten
  if (tErr = _ErrOK)
    // Kontrollobjekt zurückgeben
    return(tJob);
  else
    // Fehler zurückgeben
    return(tErr);
}

Job ausführen

Die aufgerufene Job-Funktion öffnet ebenfalls einen Empfangs- und einen Sendekanal. Sie verarbeitet alle eingehenden Nachrichten bis sie gestoppt wird.

sub JobMSX
(
  aJob                  : handle; // Job
  aEvt                  : int;    // ohne Bedeutung
)
  local
  {
    tMsxRead            : handle;
    tMsxWrite           : handle;
    tID                 : int;
  }
{
  try
  {
    // Timeout-Fehler ignorieren
    ErrTryIgnore(_ErrTimeout);
    // Empfangskanal öffnen
    tMsxRead # MsxOpen(_MsxThread | _MsxRead, aJob);
    // Sendekanal öffnen
    tMsxWrite # MsxOpen(_MsxThread | _MsxWrite, aJob);
    // Solange nicht gestoppt
    while (!aJob->spStopRequest)
    {
      // Nachricht lesen
      if (tMsxRead->MsxRead(_MsxMessage, tID) = _ErrOK)
      {
        // Nachricht schreiben
        tMsxWrite->MsxWrite(_MsxMessage, tID);
        // Nachricht verarbeiten
        switch (tID)
        {
          // ...
        }
        // Nachrichtenende lesen
        tMsxRead->MsxRead(_MsxEnd, tID);
        // Nachrichtenende schreiben und Nachricht senden
        tMsxWrite->MsxWrite(_MsxEnd, 0);
      }
    }
  }
  // Empfangskanal schließen
  tMsxRead->MsxClose();
  // Sendekanal schließen
  tMsxWrite->MsxClose();
}

Entscheidend ist hier der Funktionsaufruf tMsxRead->MsxRead(_MsxMessage, tID). Die Funktion wartet bis eine Nachricht gelesen werden kann, oder ein Timeout auftritt. Im Falle eines Timeouts tritt der Fehler _ErrTimeout auf und die Anweisung wird wiederholt. Standardmäßig liegt der Timeout bei 5 Minuten. Er kann aber auch mit der Anweisung JobControl(_JobMsxTimeoutRead) angepasst werden.

Beendet werden kann der Job entweder mit der Funktion JobControl() mit den Kommandos _JobTerminate oder _JobStop oder durch Beendigung des Elternprozesses, also des Clients. Wird der Job beendet, während er auf Nachrichten wartet, liefert die Funktion MsxRead() den Fehler _ErrTerminated.

Job stoppen

Mit der nachfolgenden Funktion kann der Job nach dessen Start wieder gestoppt werden:

sub JobStopMSX
(
  aJob                  : handle; // Kontrollobjekt
  aMsxWrite             : handle; // Sendekanal
  aMsxRead              : handle; // Empfangskanal
)
{
  // Empfangskanal schließen
  aMsxRead->MsxClose();
  // Sendekanal schließen
  aMsxWrite->MsxClose();
  // Job beenden ohne auf Ende zu warten
  aJob->JobControl(_JobStop);
  // Kontrollobjekt schließen
  aJob->JobClose();
}

Mit Job kommunizieren

Eine Kommunikation mit einem solchen Job könnte beispielsweise wie folgend ablaufen:

// Job starten (zum Beispiel beim Starten der Applikation)
gJob # JobStartMSX(var gMsxWrite, var gMsxRead);
// ...
// Nachricht schreiben
gMsxWrite->MsxWrite(_MsxMessage, 1);
// ...
// Nachrichtenende schreiben und Nachricht senden
gMsxWrite->MsxWrite(_MsxEnd, 0);
// Nachricht lesen
gMsxRead->MsxRead(_MsxMessage, tID);
// ...
// Nachrichtenende lesen
gMsxRead->MsxRead(_MsxEnd, tID);
// ...
// Job stoppen (zum Beispiel beim Beenden der Applikation)
gJob->JobStopMSX(gMSXWrite, gMsxRead);

Über die Eigenschaften spJobMsxReadQ und spJobMsxWriteQ kann zusätzlich die Anzahl der noch zu empfangenden beziehungsweise noch zu sendenden Nachrichten ermittelt werden.

Klicken Sie hier, um die Nutzungsbedingungen für unseren Blog zu lesen.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Leave the field below empty!

Wünsche, Fragen oder Feedback sind willkommen:

Nutzungsbedingungen der Kommentarfunktion im Blog

1. Allgemeines

Vectorsoft AG („Anbieter“) stellt für Internetnutzer („Nutzer“) auf der Website
vectorsoft.de einen öffentlichen Blog bereit. Der öffentliche Blog dient dem
Informations- und Gedankenaustausch. Die Nutzer, welche sich mit Beiträgen und
Kommentaren beteiligen, verpflichten sich dazu, die Blog-Nutzungsbedingungen
einzuhalten und tragen die Verantwortung für die Richtigkeit und Angemessenheit
sowie Freiheit von Rechtsverletzungen ihrer Beiträge. Mit Nutzung der
Kommentarfunktion in unserem Blog akzeptieren Sie diese Nutzungsbedingungen.

2. Netiquette

Wir bitten Sie von persönlichen Angriffen und Provokationen aufgrund anderer
Meinungen abzusehen. Bitte argumentieren Sie sachlich und bewegen Sie sich auf
der Basis einer konstruktiven Diskussionskultur. Ihr Kommentar sollte stets im
Zusammenhang mit dem jeweiligen Thema sein, um Ausschweifungen in andere
Themenbereiche zu vermeiden. Das mehrmalige Posten desselben Kommentars
oder mehrerer ähnlicher Kommentare ist nicht erlaubt.

3. Verbot rechtswidriger Inhalte

Mit Absenden Ihres Kommentars bestätigen Sie, dass Sie keine Urheberrechte oder andere Rechte Dritter verletzen. Volksverhetzende, rassistische Äußerungen, Anleitungen zu Straftaten und deren Verherrlichung, Gewaltdarstellungen, pornografische Inhalte und Äußerungen, die Persönlichkeitsrechte verletzen sind untersagt.

4. Keine Werbung

Die Nutzung der Kommentarfunktion ist für kommerzielle oder parteipolitische
Zwecke nicht erlaubt. Werbliche Beiträge aller Art werden von uns umgehend
gelöscht.

5. Angaben zum Namen

Bei der Eingabe Ihres Namens achten Sie auf die zuvor genannten Grundsätze.

6. Quellenangaben

Bitte geben Sie bei der beabsichtigten Veröffentlichung von Zitaten oder Beiträgen
Dritter die jeweiligen Quellen an und erläutern dessen Bezug zum Blogbeitrag.

7. Verstoß gegen die Nutzungsbedingungen

Beiträge, die gegen diese Richtlinie verstoßen werden umgehend gelöscht. Sollten
Sie selbst Verstöße bemerken, so senden Sie uns bitte den Link des betreffenden
Kommentars per E-Mail an . Wir weisen ausdrücklich daraufhin, dass wir einzelne Nutzer bei wiederholten oder schweren Verstößen gegen diese
Nutzungsbedingungen ausschließen werden.

Stand: Sept. 2024

Deine Trial Version - jetzt anfordern!

Teste yeet - unverbindlich und kostenfrei

IHRE EVALUIERUNGSLIZENZ - JETZT ANFORDERN!

TESTEN SIE DIE CONZEPT 16 VOLLVERSION - UNVERBINDLICH und KOSTENFREI

Melden Sie sich bei unserem Newsletter an

Anrede*
     
Zustimmung zur Datenverarbeitung gem. DSGVO*



WordPress Cookie-Hinweis von Real Cookie Banner