【发布时间】:2015-08-03 20:16:44
【问题描述】:
我在 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;
【问题讨论】:
-
连接后,线程立即返回。你也发布了假代码。请显示真实代码。一个 MCVE。您现在已经在这里提出了 100 多个问题。你应该知道现在不要发布假代码。
-
@DavidHeffernan - 对不起......我确实尝试从我的更大项目中举一个例子来说明这个问题。那么在“连接”之后,退出“执行”过程,线程是否终止?有没有办法对服务器进行级联调用并控制线程何时终止?
-
您必须正确获取这些详细信息。当我们根据问题中的内容回答时,提问者会说:“哦,但我的代码不同”,这真的很令人沮丧。
-
@DavidHeffernan - 我会尽力而为。但在某些情况下,制作 MCVE 可能需要数小时。连雷米都给我打电话了。虽然我提供的是“原型”,但我似乎至少已经解决了根本问题。对不起 - 下次会做得更好。感谢您过去对我的问题的贡献。