Announcement

Collapse
No announcement yet.

Benutzer-Eingabe am Client muß vom Server geprüft werden. Wie geht das?

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

  • Benutzer-Eingabe am Client muß vom Server geprüft werden. Wie geht das?

    Mich plagt folgendes Problem:

    In einem Formular gibt der Benutzer Werte ein. In einem Feld muß geprüft werden, ob der Wert nicht bereits vergeben ist. Diese Prüfung läuft in der Prozedur ab, die ausgeführt wird, wenn der OK-Button geklickt wird. Ob dieser Wert nicht bereits vergeben ist, weiß der Server. Deshalb wird eine Nachricht über ein TClientSocket-Objekt an den Server geschickt. Dieser antwortet auch und die Antwort kommt beim Client an. Das SockRead-Ereignis wird ausgelöst. Aber wie synchronisiere ich diese Antwort mit dem OK-Button-Event?

    Etwas konkreter:
    <PRE>
    OK-Button-Klick Prozedur
    var
    TimeOut: Boolean;
    begin
    ...
    if IstWertVergeben(EingabeFeld.Text, TimeOut) then begin
    if TimeOut then begin
    MessageDlg(FehlermeldungTimeOut);
    end
    else begin
    MessageDlg(FehlermeldungBereitsBelegt);
    end;
    end
    else begin
    ModalResult := mrOk;
    end;
    end;</PRE>

    Die Funktion IstWertVergeben() liefert False zurück falls der Wert nicht vergeben ist und True, wenn er vergeben ist. Im True-Fall muß aber auch TimeOut ausgewertet werden. Der Default-Rückgabewert ist True. Es könnte ja auch sein der Server antwortet nicht. Dafür brauche ich einen Timeout. Die Funktion sieht ungefähr so aus:
    <PRE>
    function IstWertVergeben(Wert: String; var TimeOut: Boolean): Boolean;
    begin
    Result := True;
    TimeOut := False;
    Sende Anfrage
    Warte auf Antwort oder Timeout
    Im Falle von Timeout
    TimeOut := True;
    else
    Result := ServerAntwort;
    end;</PRE>

    Meine Probleme sind: Wie bekomme ich einen Timeout von ca. 15 Sek. hin und wie bekomme ich die die Serverantwort aus dem OnRead-Ereignis dem Ergebnis der Funktion IstWertVergeben() zugewiesen?

    Oder gibt es gar eine komplett andere Lösung?

    Gruß

    Wolfgang

  • #2
    Fortsetzung:

    Momentan versuche ich folgende Lösung: Mit Hilfe eines globalen TEvent-Objekts namens SyncEvent versuche ich meine OK-Button Prozedur, die im Hauptthread läuft, mit dem OnRead Socket-Ereignis zu synchronisieren.

    <PRE>function SPSExportModelAbstract.IstWertVergeben(Value: Integer; var TimeOut: Boolean): Boolean;
    var
    WaitResult: TWaitResult;
    ServerAntwort: Integer;
    begin
    Result := True;
    TimeOut := False;
    AboutSocForm.SendWaitOk;
    TelWriteStart;
    TelWrite32(CmdSetConfigSPSExportBitVorhanden);
    TelWrite32(Value);
    SyncEvent.ResetEvent;
    AboutSocForm.TelSendCmd(CmdConfig);
    WaitResult := SyncEvent.WaitFor(SERVER_TIME_OUT);
    if WaitResult = wrSignaled then begin
    // Ok der Server hat geantwortet
    ServerAntwort := TelRead32;
    if ServerAntwort = 0 then begin
    Result := False;
    end;
    end
    else begin
    // Timeout oder was auch immer, auf jeden Fall nicht Ok.
    TimeOut := True;
    end;
    end;</PRE>

    Leider funktioniert das nicht, weil die Prozedur immer in den Timeout (10 sek.) reinläuft und das OnRead-Ereignis des Sockets erst danach abgearbeitet wird. (Zumindest sieht es so aus, wenn ich mit 2 Breakpoints die zeitliche Abfolge verfolge.) Läßt sich der Hauptthread nicht unterbrechen?

    Noch ein Info: Das Formular, dessen OK-Button die Aktion auslößt, ist modal. Hängt es damit zusammen?

    Gruß

    Wolfgan

    Comment

    Working...
    X