貌似初学,很多问题。。
  我用了个多线程
//界面线程里 
procedure a(); 
var 
i:integer; 
begin 
   //以下一共耗时大概20秒
    listbox1.items.add('开始抓页面');
    //抓取网页1
   //抓取网页2
   //抓取网页3
  listbox1.items.add('抓页面结束');
end; //线程单元 
procedure TTestThread.run; 
begin 
  mainform1.a();
  mainform1.items.add('一次抓页面结束');
end; procedure TTestThread.Execute; 
var 
  I: Integer; 
begin 
  while(true) do 
   begin
     run;
     sleep(1000);
   end;
end; 
不知道为什么,运行一段时间后,就停止了。listbox最后一条显示的是'开始抓页面',运行期间没有出现任何错误提示或者异常,咋会这样列

解决方案 »

  1.   

    a 里面肯定有错误猜测:你读取网页后肯定要分析(比如pos , substring之类的。)碰到不规则的网页的时候,就挂了。
      

  2.   

    和主线程通讯使用同步功能!
    procedure TMyThread.PushTheButton;begin
      Button1.Click();
    end;procedure TMyThread.Execute;
    begin
    ...
      Synchronize(PushTheButton);
      ...
    end;
      

  3.   

    procedure TTestThread.Execute; 
    var 
      I: Integer; 
    begin 
      while(true) do 
      begin 
        Synchronize(run); 
        sleep(1000); 
      end; 
    end; 
      

  4.   

      。。我那个方法里面要显示要好几次界面啊,这样弄一下Synchronize(run),那就是一次显示3条,不是一条一条显示了,直接run()就是一条一条显示
      

  5.   

    还有,线程中不要写这样的代码:
      while(true) do
      begin
      // ...
      end; 应该写:
    repeat
    // ...
    until Terminated;
      

  6.   

    是用idhttp抓的页面吗?有可能是抓取页面的地方停掉了
    如果是idhttp给他设置一个 ReadTimeout = 5000;试试
      

  7.   

    //线程单元 
    procedure TTestThread.run; 
    begin 
      mainform1.a(); 
      mainform1.items.add('一次抓页面结束'); 
    end; 1  我的天,你还没了解VCL的线程是不安全线程,如果要在线程里调用进程的对象的话,要加保护,就是同步,
    Synchronize(run); 这样写是正确的。2  你多个线程读取一个文件就牵扯到同步、互斥等问题,你是如何解决的?不知考虑否,否者只能叫多个单线程。