各位,请教下。我用D7做了个多线程的程序,运行的时候发现,就算多线程也只是用CPU的一个核。我运行在至强CPU服务器上,有一个核基本都跑到100%了,其他3个核还空闲着。我要怎么解决这个问题,让程序跑的跟有效率一点?多线程处理器Xeon
解决方案 »
- 怎样为应用软件中的图片加上超链接?
- DBGridEh中BoxCheckButton的问题!高分相送!
- 讨论报表中一个可视问题
- 季度BT奖评选
- 高手快来告诉我在Delphi里的SQL怎么取字符串长度的函数,告诉我啊,急!
- 关于TMediaplayer控件对第二个光驱的操纵,请教!
- 编程控制系统声音
- Delphi怎样通过日期查找或删除Accress数据库中的内容?
- 菜鸟说:又一个sql server+delphi重分!在线等待
- 请问!! int如何转换成byte?--------谢谢lastlove 0的帮助!!!!!!
- 用UltraEdit修改exe文件,保存后提示,无效的win32应用程序?
- delphi这段代码用vb如何写》?不懂delphi
当然也可以用SetThreadAffinityMask来强制设置线程的处理器亲缘性.但是如果你一个线程机器消耗CPU资源,而其他线程几乎不消耗CPU资源,那么你看到一个核心资源占用高也是正常的.
SysUtils,
Classes,
Windows;type
TRunThread = class(TThread)
protected
procedure Execute(); override;
end;
var
dwCpuCount: Cardinal;
curCpu: Cardinal = 0;
procedure TRunThread.Execute;
var
startTime: Cardinal;
begin
startTime := GetTickCount;
while not Terminated do
begin if GetTickCount - startTime > 8000 then
begin
Inc(curCpu);
if curCpu > dwCpuCount then
curCpu := 0;
SetThreadAffinityMask(Self.Handle, curCpu);
startTime := GetTickCount;
end;
end;
end;function getCpuCount: Cardinal;
var
sysinfo: TSystemInfo;
begin
GetSystemInfo(sysinfo);
Result := sysinfo.dwNumberOfProcessors;
end;begin
dwCpuCount := getCpuCount;
TRunThread.Create(False);
Readln;
end.样例每隔8秒切换至下个CPU核心,根据你的需求可以写的高级点,获得每个核心的CPU占用率,然后新建线程的时候SetThreadAffinityMask到较低的核心上。