查遍了所有的大富翁和CSDN的贴子,也没能解决的一个线程问题,不要笑我为啥这样做,我只求解决 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiNetwork/html/delphi_20061215123932117.html
constructor TThreadgetXML.Create(XMLDoc: TXMLDocument; lblIssue, lblMiniteSecond: TLabel);
begin
flblIssue := lblIssue;
flblMiniteSecond := lblMiniteSecond;
fXMLDoc := XMLDoc;
inherited Create(True);
end;
procedure TThreadgetXML.Execute;
begin
try
fIdAntiFreeze1 := TIdAntiFreeze.Create(nil);
fIdHTTP1 := TIDHTTP.Create(nil);
fIdAntiFreeze1.OnlyWhenIdle := False;
fXMLDoc.XML.Text :=
fIdHTTP1.Get('http://219.142.177.16:8381/ripado/sale.xml');
fXMLDoc.Active := true;
flblIssue.Caption := GetIssue;
fEndTime := strToInt(GetEndTime);
Synchronize(SynChangeTime);
if assigned(fIdAntiFreeze1) then
freeAndNil(fIdAntiFreeze1);
if assigned(fXMLDoc) then
freeAndNil(fXMLDoc);
if assigned(fIdHTTP1) then
freeAndNil(fIdHTTP1);
Suspend;
except
strMsg := '网络连接错误!';
Synchronize(SynAddInfo);
end
end;
显示窗体时我已经创建
计时器中调用
if endTime <= 60 then
begin
// if not assigned(ThreadgetXML) then
// ThreadgetXML := TThreadgetXML.Create(xmlDoc, lblissue, lblminiteSecond);
ThreadgetXML.Resume;
end
else
if not tmrCountDown.Enabled then tmrCountDown.Enabled := true;
第二次调用就出错了,excute代码上的部分说什么也不会被执行,请大大们帮我!
出了个地址错误,运行不到excute
唉,真没法说你了.在群里问的没完,在这居然也能看到你.看来你真的是问遍了大江南北!
inherited Create(True);这个是把线程挂起了.
要想线程序马上执行需要 inherited Create(false);
不过,你的代码有问题:
应该写成
constructor TThreadgetXML.Create(XMLDoc: TXMLDocument; lblIssue, lblMiniteSecond: TLabel);
begin
inherited Create(True);
flblIssue := lblIssue;
flblMiniteSecond := lblMiniteSecond;
fXMLDoc := XMLDoc;
resume;
end;
仍然地址错误
if endTime <= 60 then
begin
ThreadgetXML.Resume;// := TThreadgetXML.Create(xmlDoc, lblissue, lblminiteSecond);
end程序里执行是这样写么?
还是没有执行到excute
取不到新值
不关注
关键在于Execute执行体,这里应该有个循环,否则Suspend之后线程就会自动结束了。如下:
procedure TThreadGetXML.Execute;
begin
while not Terminated do
try
...
except
...
end;
end;
楼上有理
Create函数中加上这个:
FreeOnTerminate := False;
在Excute中加
while 1=1 do
begin
//你的代码;
end;
要不没有挂起点,下次从哪执行?
procedure TThreadgetXML.Execute;
fIdHTTP1 := TIDHTTP.Create(nil);<-放到TThreadgetXML.Create中
去掉fIdAntiFreeze1
尽量别用Synchronize,用postmessage消息通知界面或者在主界面用Timer刷新数据。