如果你的复杂处理语句对于i没有相关性那么是可以并行的或者说容易并行,如果他们之间有相关性,例如计算i=2的时候的值需要知道i=1的情况下的值那么就很难进行并行,当然也不实说不行,但是方法就和你的算法又很强的相关性了,就是说不同的功能实现并行的程度和方法也不一样。
当然了如果没有相关性就很简单了开十个线程就可以了。
还有就是不知道你的程序是否需要互斥一类的同步。
当然了如果没有相关性就很简单了开十个线程就可以了。
还有就是不知道你的程序是否需要互斥一类的同步。
解决方案 »
- 怎样将 当前窗口中显示的dbgrid数据导出到 excel中.
- 在广西的帮忙看看!
- 有请各位高手大侠指教!!!
- 为什么在多线程中使用Synchronize()函数?
- 急。。。有没有像任务管理器中的CPU性能监视的控件?
- 现在的icq 好像不能发短信了,是不是?
- 可以给点建议吗??路过的不要忘了近来看看,给点建议哦,谢谢!!!
- sqlserver扩展存储过程用clientsocket实现数据传输
- 如何实现与电视字幕广告一样的从左至右平滑移动效果?
- DELPHI里的input函数
- 同一事件被触发两次,如何在触发第二次时中止第一次事件?
- 在Delhi用BatchMove将.DBF导入SQL Server中,当我用BatAppendUpdate时,它为什么总是提示我没有索引??在线等待......
加入application.ProcessMessages;
application.processmessages;
来让Windows可以处理其他的作业就完成了你的串行的要求,还可以省去了创建线程所需要的资源及时间。
如果要并行处理,一个是比较麻烦,另外一个是还得保证线程的同步才行,那就必须得用delphi得TThread类来完成了。
线程就可以了。由于在循环里比较费时,在多线程的Execute函数里,多加
一些判断,看看线程的Terminated是否为true。一旦Terminated为true,马
上退出Execute。这样在主线程里调用线程的 Terminate() 之后,线程能够
马上结束。
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,如果没有达到需要的值,并且某些线程空闲了,那么就重新分配一个任务,否则结束该线程。如果所有的线程都结束了,那么工作也就完成了。
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;
False,线程终止后则赋为True 。在线程的最里层进行消息处理ProcessMessage
紧接着判断是否被用户终止,据此来决定是否继续线程内部的下一次循环。
False,线程终止后则赋为True 。在线程的最里层进行消息处理ProcessMessage
紧接着判断是否被用户终止,据此来决定是否继续线程内部的下一次循环。
To chiphead(满脑袋芯片和程序的人) :主控线程怎么写
to chinajavis(我选择 我喜欢) :如何在最里层进行消息处理。
我认为用单线程高优先级,可以使CPU充分发挥作用,并达到自己的目的。关于优先级问题我在深入浅出学mfc上看到过,
我在看看,
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;
虽然这方法不是很好,要是能配合一个线程的优先级就会更好,不要搞多线程,单线程就可以了,否则会更慢的
如果你的程序执行过程中总是要等待一些较慢的东西比如网络什么的多线程也许会有好处。
如果你的程序是那种死循环,CPU占用绿是100%的话都线程只会使效率更低!
和网络蚂蚁以类的东西可以不一样!
你说的很对,但是你忽略了一个重要的问题,就是你一旦在循环内部加入sleep,那程序执行的效率会降低很多。试问,你准备sleep多久?1个毫秒?那这个循环要多久才可以完成?最起码要多用1倍以上的时间。(仅仅针楼主的问题来说)其实,作为Windows来说,你看到的CPU时间片是100%,但是,它根本不可能是100%。如果真的占用了100%的话,你的所有操作都会停止。就好象死机一样。
而作为副线程来说,它主要就是来分担主线程中过大的工作量,而且,这段程序只是执行完毕就结束,所以,我觉得应该是尽量的提高它的速度,而不是降低它的速度来让出CPU的时间。