TThread内でipWorksコンポーネントTipwIPPortを使用しています。私が理解しているように、TipwIPPort はノンブロッキングです。
私は、Executeメソッド内のすべての処理が「ブロック」されるスレッドの作成に精通しています。
この例では、リモート サーバーに接続してから、 TipwIPPort.DataToSendを使用して後続の呼び出しを行う必要があります。スレッドのExecute関数でConnectメソッドを呼び出します。ただし、OnConnectedイベントは発生しません。
スレッドをいつ終了するかを制御できるように、どのパラメーターとプロパティを設定する必要がありますか (コンストラクターに渡される "CreateSuspended"、FreeOnTerminate値など)。
type TMyThread=class(TThread)
private
IPPort1: TipwIPPort;
procedure IPPort1Connected(Sender: TObject; StatusCode: Integer; const Description: String);
procedure IPPort1DataIn(Sender: TObject; Text: String; EOL: Boolean);
end;
procedure TMyThread.IPPort1Connected(Sender: TObject; StatusCode: Integer; const Description: String);
begin
// never get here
AppendToLog('Status Code in Connect:'+inttostr(StatusCode)+'; Description:'+Description);
if StatusCode = 0 then begin
// send data to server using ipport1.datatosend.....
end;
end;
procedure TMyThread.Execute;
begin
appendtolog('TMyThread.Execute');
IPPort1 := TipwIPPort.Create(nil);
try
With IPPort1 do begin
EOL := #4;
KeepAlive := True;
OnConnected := IPPort1Connected;
OnDataIn := IPPort1DataIn;
end;
IPPort1.Connect('xxx.xxx.xxx.xxx',8888);
appendtolog('done with execute');
finally
end;
end;
procedure TMyThread.IPPort1DataIn(Sender: TObject; Text: String; EOL: Boolean);
begin
if (Pos('keytoendconnection',Text)>0) then begin
ipPort1.Disconnect;
// Terminate the thread and free
end;
end;
procedure TForm1.Button1Click(sender: TObject);
var
myThread;
begin
// what parameters and properties do I need to set to allow me to control when the thread is terminated???
myThread := TMyThread.Create(True);
mSouthernObject.FreeOnTerminate := False;
mSouthernObject.Resume;
end;