Sprung zum Seitenende Struktur Themen A...Z Titel << >>

CXI-Basis-Programmierreferenz / Version 2 / Datenaustausch / Ebene 2 / Message Queue /

GlobalWaitState - Globale Queue abarbeiten

[C++] static CxiError CXIB :: GlobalWaitState (CxiLong options = 0)
[C] CxiError cxiGlobalWaitState (CxiLong options)

[S2:STANDARD] [Portabilitätswarnung] Arbeitet Meldungen der globalen Queue ab

options:
Optionen, einer der folgenden Werte:
- cxiOptWaitStateAll: Die Funktion arbeitet alle Meldungen der Queue ab und kehrt erst dann zurück;
- 0 (Vorgabe): Die Funktion arbeitet eine Meldung der Queue ab und kehrt dann zurück.
Ist die Queue leer, erfolgt in beiden Fällen eine sofortige Rückkehr.

return:
immer cxiNoError (0).

Diese Funktion ist die einzige Möglichkeit, Meldungen abzuarbeiten, die in der globalen Queue stehen. Das Programm sollte diese Funktion in seiner Hauptschleife regelmäßig aufrufen.

Portabilität:
Die globale Queue ist ab Version 2.04 definiert und in allen unterstützten Systemen verfügbar, bisher jedoch nur für Borland-Compiler. Um die globale Queue benutzen zu können, muss CXIMSGQ.CPP in das Projekt aufgenommen werden. Jeder Prozess besitzt eine eigene globale Queue.

Siehe auch:
Allgemeines zur globalen Queue
PostMessageTreeOptions - Globale Queue aktivieren
Post, PostMessageTree - Verschicken einer Meldung
Pass - Weiterleiten einer empfangenen Meldung

Beispiel:
Das folgende Programm definiert zwei Empfänger (R1 und R2), die eine Meldung hin und her schicken und dabei jeweils einen Zähler erhöhen. Nach 1000 Durchläufen beendet sich das Programm. Wird der Parameter "1" angegeben, wird die globale Queue verwendet, ansonsten nicht.

#include <stdlib.h>
#include <stdio.h>
#include "cxi.h"

static volatile char TermFlag;

class DemoReceiver2 : public CxiMessageHandlerWithQueue
{
public:
  DemoReceiver2 (const char *name)
    : CxiMessageHandlerWithQueue (name) {}
protected:
  long Handler2 (CxiTree& t, CxiNode& n);
};

long DemoReceiver2::Handler2 (CxiTree& t, CxiNode& e)
{
  int i = t.GetVarAsInt ("Counter");
  t.SetVarInt ("Counter", i+1);
  printf ("%s+%d\t", QueryIdent (), i);
  if (i < 1000)
    Post (t, e.GetItem ("MsgA.From"));
  else
    TermFlag = 1;
  printf ("%s-%d\t", QueryIdent (), i);
  return 0;
}

int main (int argc, char **argv)
{
  if (argc > 1 && atoi (argv [1]))
    CXIB::PostMessageTreeOptions (cxiOptPostMsgForceQueue, 0);
  else
    CXIB::PostMessageTreeOptions (0, cxiOptPostMsgForceQueue);

  printf ("Vor Konstruktoren\n");

  DemoReceiver2 r1 ("R1");
  DemoReceiver2 r2 ("R2");

  printf ("Nach Konstruktoren, vor Post\n");

  PostMessageTree ("Counter=0", "R1", "R2");

  printf ("Nach Post, vor Schleife\n");

  // Hauptschleife
  while (TermFlag == 0)
    GlobalWaitState ();

  printf ("Nach Schleife\n");
  return 0;
}

Wird dieses Programm für DOS generiert und mit dem Parameter 0 aufgerufen, also ohne globale Queue, so ergibt sich ein Abbruch:

Vor Konstruktoren
Nach Konstruktoren, vor Post
R1+0    R2+1    R2-1    R1-0    R1+2    R2+3    R2-3    R1-2
...

*** CXIBASE FATAL ERROR CXIB#04904: STACK OVERFLOW ***
Minimum=0x0300, Current=0x02EE, Maximum=0x5010.
Abnormal program termination

Mit dem Parameter 1 aufgerufen, also mit globaler Queue, läuft das Programm:

Vor Konstruktoren
Nach Konstruktoren, vor Post
Nach Post, vor Schleife
R1+0    R1-0    R2+1    R2-1    R1+2    R1-2    R2+3    R2-3
...
R1+998  R1-998  R2+999  R2-999  R1+1000 R1-1000 Nach Schleife


[i] CXI-Basis-Programmierreferenz
Version 2.10 72 (1014-001), erstellt am 15. April 2000
Textseite 333 von 855, Thema 8298 (GlobalWaitState)
[c] Copyright (c) 1996-2000 by TeraConnect GmbH

Sprung zum Seitenanfang Struktur Themen A...Z Titel << >>