现在的位置: 首页 > 综合 > 正文

查遍了所有的大富翁和CSDN的贴子,也没能解决的一个线程问题,不要笑我为啥这样做,我只求解决

2013年05月08日 ⁄ 综合 ⁄ 共 2387字 ⁄ 字号 评论关闭
查遍了所有的大富翁和CSDN的贴子,也没能解决的一个线程问题,不要笑我为啥这样做,我只求解决 Delphi / Windows SDK/API
http://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刷新数据。  
 

抱歉!评论已关闭.