Delphi: Как ждать, пока вся информация будет прочитана из сокета, используя поток - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть Delphi lib, которая должна возвращать информацию, прочитанную через сокет.

function GetBufferInfo(Address: PChar): PChar; export; stdcall;
var
  BD: TBufferData;
begin
  BD := TBufferData.Create;
  Result := PChar(TBufferData.GetData);
  BD.Free;
end;

В классе TBufferData есть метод ReadData, который вызывается при срабатывании события чтения сокета. Так что его можно вызывать несколько раз, пока вся информация не будет прочитана. Проблема в том, как ждать, пока информация читается, и не выходить из метода GetBufferInfo. Я думал о темах, но не знаю, как именно это можно сделать.

Я создал небольшой пример, демонстрирующий проблему:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes, Windows;

type
  TBufferData = class
  private
    FResult: string;
  public
    constructor Create;
    procedure ReadData(Sender: TObject; Buf: string; var Size: Integer);
    function GetData: string;
  end;

{ TBufferData }

var
  BD: TBufferData;
  s: string;
{ TBufferData }

constructor TBufferData.Create;
begin
  FResult := 'Some text received via socket';
end;

function TBufferData.GetData: string;
begin
  Result := FResult;
end;

procedure TBufferData.ReadData(Sender: TObject; Buf: string; var Size: Integer);
begin
  //info is being received from socket
  FResult := FResult + Buf;
end;

begin
  BD := TBufferData.Create;
  s := BD.GetData;
  Writeln(s);
  BD.Free;
  Readln;
end.

Заранее спасибо Yura

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Application.ProcessMessages для консоли будет выглядеть следующим образом.Государственный флаг будет установлен снаружи.

while State <> stDone do begin
  ...
  ProcessMessages;
end;

procedure ProcessMessages;
var
  Msg: TMsg;
begin
  if PeekMessage(Msg,0,0,0,0) then begin
    GetMessage(Msg,0,0,0);
    DispatchMessage(Msg);
  end;
  Sleep(10);//sleep to avoid 25% processor decrease
end;
0 голосов
/ 23 сентября 2011

Только код, который читает сокет, будет знать, когда данные будут закончены.Пока он не обнаружит это условие, он не должен хранить какие-либо данные для доступа к GetBufferInfo ().GetBufferInfo () сможет вернуть данные только после завершения данных.Поэтому вам нужно переписать свой код, чтобы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...