Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozedur warten lassen (https://www.delphipraxis.net/46887-prozedur-warten-lassen.html)

Pseudemys Nelsoni 2. Jun 2005 13:03


Prozedur warten lassen
 
Moin,

ich bin gerade dabei eine DLL zu schreiben. Die Funktion, die durch ein Programm aufgerufen wird soll etwas von google zurückgeben, das heisst ich Öffne dort eine Socket-Verbindung. Das Problem ist nun, wie lass ich die Funktion warten bis ein Ergebnis (OnRead vom ClientSocket) ausgelöst wird?
So sollte das ablaufen:

Delphi-Quellcode:
function AufzurufendeFunktion: Integer;
begin
  Result := 0;
  // Socket-Verbindung öffnen
  // Warten bis Ergebnis da ist
end;

procedure Socket.OnRead;
begin
  Socket.ReceiveText;
  // Ergebnis ist da
end;

Nur wie setze ich das Warten um?

Zacherl 2. Jun 2005 13:24

Re: Prozedur warten lassen
 
mach doch einfach erst weiter, wenn das OnClientRead Ereigniss ausgeführt wurde. Dazu musst du nur alle weiteren Befehle in das OnClientRead Ereigniss hinter ...ReceiveText; schreiben.

Florian

Sanchez 2. Jun 2005 13:40

Re: Prozedur warten lassen
 
Hi Pseudo,

Was du brauchst, sind blockierende Sockets (Client-Type: ctBlocking).
Schau dir dazu den TWinSocketStream an.

grüße, daniel

Pseudemys Nelsoni 2. Jun 2005 14:01

Re: Prozedur warten lassen
 
Zitat:

mach doch einfach erst weiter, wenn das OnClientRead Ereigniss ausgeführt wurde. Dazu musst du nur alle weiteren Befehle in das OnClientRead Ereigniss hinter ...ReceiveText; schreiben.
Das bringt aber nichts, weil die aufgerufene funktion ja das ergebnis zutückgeben muss, d.h sie darf nicht beendet werden.

@Sanchez: Würde es reichen wenn ich bei ClientSocket auf ctBlocking stelle? Was würde das bewirken?

Sanchez 2. Jun 2005 14:28

Re: Prozedur warten lassen
 
Nein, es würde nicht reichen.
Bei blockierenden Verbindungen sieht der Aufruf ganz anders aus.
Ich hab jetzt leider zuwenig Zeit, um dir ein Beispiel zu geben.
Sieh dir mal den TWinSocketStream.

Gegen Abend hab ich evtl. Zeit für ein kleines Beispiel.

grüße, daniel

Pseudemys Nelsoni 2. Jun 2005 14:37

Re: Prozedur warten lassen
 
Moin Sanchez,

leider habe ich keine Ahnung davon, d.h ich würd mich freuen wenn du heut Abend oder so ein Beispiel hättest;)

mfg

Sanchez 2. Jun 2005 21:05

Re: Prozedur warten lassen
 
Hallo Pseudo,
Hier mal ein ungetesteter Versuch:

Delphi-Quellcode:
function AufzurufendeFunktion: Integer;
var SockStream: TWinSocketStream;
    Buffer: Array[0..1024] of char;
    Request, Ergebnis: string;
begin
  Ergebnis:= '';
  Request := 'Anfrage';
  FillChar(Buffer, sizeof(Buffer), #0);
  // Socket-Verbindung öffnen
  SockStream := TWinSocketStream.Create(ClientSocket.Socket,60000);
  SockStream.Write(Request, Length(Request) + 1);
  // Warten bis Ergebnis da ist
  if WaitForData(60000) then begin
    while (SockStream.Read(Buffer, SizeOf(Buffer)) <> 0) do begin
      Ergebnis:= Ergebnis+ Buffer;
    end;
  end;
  SockStream.Free;

  result := KeineAhnung;
end;
Mit den TimeOut-Zeiten kannst du ein wenig variiern. Wichtig ist, dass du den Socket auf ctBlocking einstellst und vorher verbindest.

grüße, daniel

Pseudemys Nelsoni 7. Jun 2005 11:16

Re: Prozedur warten lassen
 
Danke Sanchez, teste ich gleich ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz