2011-09-23 20 views
0

我有Delphi lib,它必须通过套接字读取信息读取。Delphi:如何使用线程等待所有信息从套接字读取

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

TBufferData类有一个方法ReadData,它在套接字Read事件触发时被调用。所以可以多次调用它,直到读取所有信息。问题是如何在读取信息的同时等待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. 

在此先感谢 由良

+0

GetBufferInfo返回一个指向已被释放的内存的指针。至于问题的其余部分,我看不到ReadData是如何被调用的。 –

回答

0

控制台的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

只有在读取插座时,数据完成都知道的代码。直到它检测到这种情况,它不应该为GetBufferInfo()存储任何数据。只有当数据完成时,GetBufferInfo()才能够返回它。所以你需要重写你的代码来做到这一点。