Announcement

Collapse
No announcement yet.

RemoteDataModule: Statusmeldungen an den Haupt-Thread senden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • RemoteDataModule: Statusmeldungen an den Haupt-Thread senden

    Ich habe folgendes Problem:<BR>
    In einer 3-Schichtarchitektur werkelt ein RemoteDataModul welches Statusmeldungen im Fenster des Appl.Server ausgeben soll. Dieses läuft, soweit ich sehen kann, in einem anderen Thread. Damit müssten Aufrufe in VCL-Komponenten des Hauptfenster mit Synchronize gekapselt werden. Um Syncronize benutzen zu können benötigt man aber das TThread-Objekt (des RomoteDataModul in diesem Fall). Wo findet man aber das TThread-Objekt des RDM? <BR>
    Oder gibt es einen anderen Weg Statusmeldungen aus dem RDM threatsicher zu versenden?<BR>
    Gruss Peter

  • #2
    Hallo,

    normalerweise hat das Server-Modul einer dreischichtigen Anwendung keine Benutzeroberfläche, sondern verwendet die <i>Ereignisanzeige</i> des Betriebssystems oder eine eigene Logdatei, um irgendwelche Informationen abzulegen. In der Variablen <i>FFrmWnd</i> wird das Fensterhandle des Formulars (TForm.Handle) abgelegt:

    Wenn trotzdem Daten vom RDM im Hauptformular angezeigt werden sollen, würde ich zu <b>PostMessage</b> greifen, um eine private Botschaft zum Hauptfenster zu schicken. Der Vorteil von PostMessage liegt darin, dass in jedem Fall die Hauptfunktion (RemoteDataModule) nicht beeinträchtigt wird, sondern statt dessen die Anzeige in der Benutzeranzeigt nur dann erfolgt, wenn der Server "mal gerade nichts zu tun hat". Dies könnte dabei so aussehen, wenn eine Zeichenkette übertragen werden soll:
    <pre>
    var
    sInfo : String
    begin
    ...
    PostMessage(FFrmWnd, PM_INFOMSG, 0, Integer(PChar(sInfo)));
    end;
    </pre>
    Auch dann, wenn der Gültigkeitsbereich der lokalen Variable sInfo (liegt auf dem Stack) bereits verfallen ist, kann Delphi die Information noch zustellen (Nebenwirkung der Typumwandlung über PChar), wenn der primäre Thread der VCL die private Botschaft später verarbeitet. Das Zuschicken von INTEGER-Werten etc. (über die beiden freien Parameter <i>wParam, lParam</i>) ist selbstverständlich an dieser Stelle einfacher.

    Die Botschaftsauswertung im Hauptformular könnte dann so aussehen:
    <pre>
    const
    PM_INFOMSG = WM_APP + 1;
    type
    TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    procedure PMINFOMSG(var Msg: TMessage); message PM_INFOMSG;
    public
    { Public-Deklarationen }
    end;
    var
    Form1: TForm1;
    implementation
    {$R *.dfm}
    { TForm1 }
    procedure TForm1.PMINFOMSG(var Msg: TMessage);
    var
    sTmp : String;
    begin
    sTmp := PChar(Msg.lParam);
    Memo1.Lines.Add('PMApp: ' + sTmp);
    end;
    </pre&gt

    Comment

    Working...
    X