如果你的复杂处理语句对于i没有相关性那么是可以并行的或者说容易并行,如果他们之间有相关性,例如计算i=2的时候的值需要知道i=1的情况下的值那么就很难进行并行,当然也不实说不行,但是方法就和你的算法又很强的相关性了,就是说不同的功能实现并行的程度和方法也不一样。
当然了如果没有相关性就很简单了开十个线程就可以了。
还有就是不知道你的程序是否需要互斥一类的同步。

解决方案 »

  1.   

    并行的时候需要注意资源共享的问题,不要访问冲突了。如果只是想在这样的循环语句中要系统能响应其他消息,只需要在适当的地方
    加入application.ProcessMessages;
      

  2.   

    其实你也可以不用线程来做的,你在每执行到一定循环的时候用
    application.processmessages;
    来让Windows可以处理其他的作业就完成了你的串行的要求,还可以省去了创建线程所需要的资源及时间。
    如果要并行处理,一个是比较麻烦,另外一个是还得保证线程的同步才行,那就必须得用delphi得TThread类来完成了。
      

  3.   

    想要并行处理处理,直接new十个线程好了。想要串行处理,你只要new一个
    线程就可以了。由于在循环里比较费时,在多线程的Execute函数里,多加
    一些判断,看看线程的Terminated是否为true。一旦Terminated为true,马
    上退出Execute。这样在主线程里调用线程的 Terminate() 之后,线程能够
    马上结束。
      

  4.   

    我打算改用线程有三个目的,一是要提高运算速度,而是在不能提高速度的前提下空出资源给其他应用程序使用,因为如果用for循环一次执行上千万次,就和死机一样,而且使用application.processmessages使程序运行速度变得更慢;三是在必要的时候可以终止本次操作,而不必按Ctrl+Alt+Del结束整个程序,各位在这三个方面有何良策,当然,速度是最重要的。
      

  5.   

    unit Unit1;interfaceuses Classes, SyncObjs;type
    TMyThread = class(TThread)
    protected
    procedure Execute; override;
    end;var
    FinishedWorks: Integer = 0;
    CounterLock: TCriticalSection; // 启动线程之前必须先初始化implementation{ TMyThread }procedure TMyThread.Execute;
    var i,j,k: Integer;
    begin
    for i := 1 to 100000 do
    for j := 1 to 100000 do
    begin
    if Terminated then Exit;
    // Do some complicated work
    end;
    // When finished, increase the counter
    CounterLock.Acquire;
    try
    Inc(FinishedWorks);
    finally
    CounterLock.Release;
    end;
    end;end.你可以另外写一个主控线程,它负责不断地检查FinishedWorks,如果没有达到需要的值,并且某些线程空闲了,那么就重新分配一个任务,否则结束该线程。如果所有的线程都结束了,那么工作也就完成了。
      

  6.   

    可以用semaphore控制最多可执多少个线程var MinCount: Integer; //当前还可以执行几个线程
        MaxCount: Integer;//可执行线程的最大数目hs = CreateSemaphore(nil,CurrentCount,MaxCount,nil);
    for i:=1 to 10 do
      NewThread.Create(true,i);**********************************************
    NewThread:if WaitForSingleObject(hs,INFINITE) = WAIT_OBJECT_0 then //线程开始   ReleaseSemaphore(hs,1,nil);//线程结束
    end;
      

  7.   

    线程很简单的,你自己NEW一个来看看再说吧....
      

  8.   

    定义一个数组记录这十个线程是否被用户要求终止,在线程被创建时对应的赋为False ;另一个数组记录这十个线程是否已经终止,在线程被创建时对应的赋为
    False,线程终止后则赋为True 。在线程的最里层进行消息处理ProcessMessage
    紧接着判断是否被用户终止,据此来决定是否继续线程内部的下一次循环。
      

  9.   

    定义一个数组记录这十个线程是否被用户要求终止,在线程被创建时对应的赋为False ;另一个数组记录这十个线程是否已经终止,在线程被创建时对应的赋为
    False,线程终止后则赋为True 。在线程的最里层进行消息处理ProcessMessage
    紧接着判断是否被用户终止,据此来决定是否继续线程内部的下一次循环。
      

  10.   

    如果想提高速度的话最好用多个cpu否着像你这种算法速度快不了多少,因为cpu不可能并行处理。
      

  11.   

    谢谢各位大侠,辛苦了,我正在尝试,请问:
    To chiphead(满脑袋芯片和程序的人) :主控线程怎么写
    to chinajavis(我选择 我喜欢) :如何在最里层进行消息处理。
      

  12.   

    To:mengzq(小梦) 多个cpu能解决问题吗?
      

  13.   

    如果你真的要用多线程,就象chiphead(满脑袋芯片和程序的人) 说的那样去创建一个线程类。不过,不管你怎么样创建线程类,它们占用CPU的时间片还是一样的。只是从表面上看到了程序是不会停下来。但你一定要注意用Application.ProcessMessage.否则,CPU占用率一样是100%。可是,这样还是会降低程序的执行效率。你的线程创建的越多,效率就越底,所以,最好是创建一个线程,把你的循环放到这一个线程中去就可以了,这样,总体来说,可以达到你要的效果。
      

  14.   

    线程越多效率越低,因为cpu来回切换线程还要时间。
      

  15.   

    看了deathcat(从死亡边缘站起来的猫)的意见,有一种恍然大悟的感觉!我也同意他的看法。其实这个问题最好的解决办法就是创建一个线程,然后在它的Execute方法中间执行那个大循环。这样最简单,而且效率不会降低很多。其实线程越多,操作系统管理线程切换的工作量就越大(对于每个线程都要执行保存现场、恢复现场的工作,很耗时间的)。
      

  16.   

    执行线程有优先级的问题,
    我认为用单线程高优先级,可以使CPU充分发挥作用,并达到自己的目的。关于优先级问题我在深入浅出学mfc上看到过,
    我在看看,
      

  17.   

    多线程不是什么地方都用的,要看场合,滥用是不行的,你的这种程序不适合用多线程的,这种代码:
    for i:=0 to ... do
      begin
     ....
    application.progressmessage;
    end;
    要用100%CPU的,一定的,我是试过N次了,但这样OS还可以Control你的APP,要想要让出一些CPU时间,就要用个诀窍,不过我会告诉你的
    是sleep(),在这儿有特殊用途的:空出CPU时间给其它应用程序,
    改为
    for i:=0 to ... do
      begin
     ....
    Sleep(3);//越大就空越多时间,不要>100不然你的程序会有点响应不及时,>10时程序效率是很低的,一般<5的,也不要用在最内层的循环里,除非只有一层
    application.progressmessage;
    end;
    虽然这方法不是很好,要是能配合一个线程的优先级就会更好,不要搞多线程,单线程就可以了,否则会更慢的
      

  18.   

    呵呵,推荐你看一本线程方面经典的书,你看过之后一定会觉得这个问题解决的办法实在太多了,而且你也能清楚的知道哪种更好!!这本书是侯捷译的: <<Win32 线程程序设计>>,个人以为这是本值得收葳的好书!! 
      

  19.   

    如果你是多CPU的话那么多线程可以提高速度。
    如果你的程序执行过程中总是要等待一些较慢的东西比如网络什么的多线程也许会有好处。
    如果你的程序是那种死循环,CPU占用绿是100%的话都线程只会使效率更低!
    和网络蚂蚁以类的东西可以不一样!
      

  20.   

    to ly_liuyang(Liu Yang) 
    你说的很对,但是你忽略了一个重要的问题,就是你一旦在循环内部加入sleep,那程序执行的效率会降低很多。试问,你准备sleep多久?1个毫秒?那这个循环要多久才可以完成?最起码要多用1倍以上的时间。(仅仅针楼主的问题来说)其实,作为Windows来说,你看到的CPU时间片是100%,但是,它根本不可能是100%。如果真的占用了100%的话,你的所有操作都会停止。就好象死机一样。
    而作为副线程来说,它主要就是来分担主线程中过大的工作量,而且,这段程序只是执行完毕就结束,所以,我觉得应该是尽量的提高它的速度,而不是降低它的速度来让出CPU的时间。
      

  21.   

    sleep应该用gettickcount和Application.ProcessMessage代替
      

  22.   

    多谢各位高手的指点,让我的思路更开阔,这两天我正在做有关算法的调整,以及对是否采用线程进行测试,希望各位前辈能继续提出好建议,如果可能的话发一些线程方面的经典例子到[email protected],谢谢。
      

  23.   

    用application.progressmessage好象降低了软件运行速度,另外我想了解一下它是如何处理信息的。
      

  24.   

    application.progressmessage 是处理一次系统消息.就是将CPU的时间片让出去,以免造成了计算机假死状态.在你的循环中,application.progressmessage最好和sleep结合使用,这样才会有明显的效果.使用application.progressmessage当然会造成软件的运行速度了.
      

  25.   

    Larky 、 jishiping 、 ChipHead 、 shinesi、 chinajavis 、 DeathCat 、 ly_liuyang 、 weizhi、 yangkunjie 请到http://www.csdn.net/expert/topic/680/680478.xml?temp=.2019617领分