俺写了一个线程类 TMyThread = Class(TThread) , 最后调用如下:var mythread1,mythread2 : TMyThread;mythread1 := TMyThread.Create(True);
mythread2 := TMyThread.Create(True);.....(给每个线程传递不同参数)MyThread1.resume;  //启动线程
MyThread2.resume; 俺的问题是:
1. 如果如网络蚂蚁下载程序那样,可以自定义线程数量,俺如何动态定义如mythread1...mythreadn这样的线程实例呢?
2. 如果俺定义可以同时启动5个线程,那么,如果当前5个线程中有任何一个运行完成后,俺需要立刻创建新的线程,并且还需要使用已用过的线程实例名,不知道如何处理?望各位DX指点。谢谢!

解决方案 »

  1.   

    你在线成的excute中若执行完你的操作后就suspend它,然后在主进程中使用线程对象.suspended来判断,true为正在运行反之为停止
      

  2.   

    在俺这个应用中,不能把执行完成的线程suspend.只能执行完成后销毁。但是,俺定义的动态数组中,mythread[i] :=  TMyThread.Create(True);当mythread[i]指向的线程对象销毁后,判断mythread[i] 仍然不是nil ,不得其解。???
      

  3.   

    判断 WaitForSingleObject(mythread[i].Handle) = WS_OBJECT 则表示系统已经结束, 或者在创建线程后, 把 mythread[i].Handle 保存到相应的数组中即可.
      

  4.   

    Kyee: 谢谢回复。但是俺运行到WaitForSingleObject后,程序就不动了。我在TMyThread的Destroy中,首先Inherited Destroy;然后再判断Handle 和 ThreadId,居然都和创建时候一样???难道线程在Destroy后还没有销毁??俺现在想的办法是:在TThreadId的定义中,加入一个FArrayId的私有变量,mythread[i] := TMyThread.Create(True);后,将数组下标写到FArrayId中,然后,当线程对象销毁时,在TThreadId.Destroy中,就知道mythread[i]已经销毁,然后触发用这个数组下标来创建新的线程。 现在的问题是,程序调试没有问题,也没有出现错误。但是如果mythread[1]指向的线程对象依然在运行,俺再用mythread[1]=TMyThread.Create来创建新的线程,也没有错误???所以这样的程序应该是不安全的,望DX指点。谢谢!!