本帖最后由 WinSockCF 于 2011-04-12 12:51:47 编辑

解决方案 »

  1.   

    你有10个线程,可以定义 t: integer; t:= 1; 每个线程执行完后 inc(t)主程序里 while t < 10 do ...
      

  2.   


    只是执行了一些数值相加的动作.怎么把Readln;换成其它的?比如等待线程执行完的代码或其它的都可以使用WaitForMultipleObjects的话也不行.不知道怎么改,才能增加控制台的运行期~
      

  3.   

    WaitForMultipleObjects函数使用错误
    你应该让你程序中的 Addnum[i].handle组成一个数组,然后用这个数字调用
    WaitForMultipleObjects
    而不是你程序中给出的线程对象指针数组作为等待数组
      

  4.   

    var
      i:Integer;
      Addnum:array[0..9] of THandle;
    begin
      try
        for I := 0 to 9 do
        begin
          with TAddNumThread.Create(True) do
          begin
            Addnum[I] := Handle;
            FreeOnTerminate :=True;
            Start;
          end;
        end;
        WaitFormMultipleObjects(10,@Addnum,True,INFINITE);关闭了
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
      

  5.   

    谢谢你!~刚又看了一下帮助,原来是个Thandle指针.!还有噢,为什么WaitForMultipleObjects这个函数只能支持最大等待64个线程呢?如果我想设置为100个线程,那该如何修改此代码?
      

  6.   


    for i:=0 to 99 do
    begin
      addnum[i].waitfor;
      addnum[i].free;
    end;
    用你原来的代码,把Addnum[i].FreeOnTerminate :=True;去掉
    然后把Readln;换成上边代码就可以了!
      

  7.   

    设置一个全局变量ThreadCount开始初始化为0开始线程(for语句)前ThreadCount := length(Addnum);在每个线程的destroy里用InterlockedDecrement(ThreadCount)线程开始后(for语句后),用一个while 语句判断直到ThreadCount为0while ThreadCount > 0 do 
      Sleep(10);