本帖最后由 aion1949 于 2009-08-09 07:46:47 编辑

解决方案 »

  1.   

        New(MyPara); 
        MyPara^.aUrl  := 'http://www.baidu.com/?page='; 
        MyPara^.aPage  := inttostr(i); 
        MyPara^.aXxx  := 'W3c'; 
        CreateThread(nil, 0, @aThreadRun, MyPara, 0, ID); 
              end;
       //Dispose(MyPara); 这里能用这个吗?一用就异常 
        //MyPara:=nil;    这里能用这个吗?一用就异常以上的代码,后两句肯定是不能用的,因为CreateThread创建线程后就把MyPara给释放了,而这时线程函数aThreadRun正在用MyPara.要清楚一点的是CreateThread只是创建线程,创建成功后就立即返回了,具体执行是aThreadRun.
      

  2.   

    第二个问题:
    CreateThread函数返回线程句柄,你需要把所有的线程句柄记录下来,然后在合适的时机调用
    SuspendThread或ResumeThread函数来暂停线程或恢复线程的运行,这两个函数都需要使用已
    创建线程的句柄作参数
      

  3.   

    附第一个问题:
    1楼关于这个问题的说明是正确的
    具体解决的时候你可以在线程外申请Mypara的存储器,即调用New(MyPara); 
    在线程不再使用这个的时候在线程内部释放就可以了,即调用Dispose(MyPara)
      

  4.   

    内存泄漏问题已解决,谢谢几位歌歌的热心帮助。我改了下面几个地方:
    ...
    aHandle := CreateThread(nil, 0, @aThreadRun, MyPara, 0, ID);   ///
    CloseHandle(aHandle); 
    ...
    Dispose(xParameter(p));
    ...
    再有就是 String型变量内存的释放
    还有个很严重问题就是:try ... except... 结构,我搞错了,最下面的 xxx.free 完全不会执行。最后用上了 try ... finally ... 结构,内存泄漏问题已解决,很开心。现在还有个问题就是:不知道如何随时暂停、继续已经运行的多个线程,估计那时不能立即关闭创建线程时产生的线程名柄了。