循环 CUP占用 100% 如何解决?(174分)

  • 主题发起人 cn01574978
  • 开始时间
C

cn01574978

Unregistered / Unconfirmed
GUEST, unregistred user!
如题:
例:在一个非常大的喜欢中,
For i:=0 to 10000do

For j:=0 to 10000do
For k:=0 to 10000do
Procedure(i,j,k);
这里是自己写的函数;
当运行它后 CUP 就占用到 100% 并且还会程序不响应,
网络上找到一个方法:就是在循环中调用 Application.processmessage
可是这个方法 只能解决在循环中 分一点CUP时间给 其他应用窗口响应消息,
也就是 这个循环的程序不会出现假死状态。
可是CUP的占用还是没有解决。
请问:有什么方法能实现CUP占用低,并且可以即使看到循环结果的方法?
需要参看那些材料?
谢谢谢谢各位啦.....
 

迷路人

Unregistered / Unconfirmed
GUEST, unregistred user!
将其独一放入一个线程,降低线程优先级。
 
T

themars

Unregistered / Unconfirmed
GUEST, unregistred user!
循环时 sleep 一点时间
 

无欲则刚

Unregistered / Unconfirmed
GUEST, unregistred user!
用线程解决
 
I

iamy

Unregistered / Unconfirmed
GUEST, unregistred user!
线程也没有用。
你不释放CPU资源,当然100%了
Sleep()一下
 
N

nicai_wgl

Unregistered / Unconfirmed
GUEST, unregistred user!
For i:=0 to 10000do

For j:=0 to 10000do
begin
For k:=0 to 10000do
Procedure(i,j,k);
sleep(10);
end;
 

张辉明

Unregistered / Unconfirmed
GUEST, unregistred user!
这种代码,一般都有办法可以优化的。
 
L

lxw5214

Unregistered / Unconfirmed
GUEST, unregistred user!
用线程可以降低cpu的,我的程序就是一个循环,直到程序关闭,循环放在线程了,cpu也只是10%;
 
T

tandxu

Unregistered / Unconfirmed
GUEST, unregistred user!
同意 张辉明
先优化代码,再线程(优先级)
 
J

jenhon

Unregistered / Unconfirmed
GUEST, unregistred user!
我认为如果没法从根本上去解决优化代码、又不想开线程的话,
通过 Application.processmessage 把cpu时间片让出去是一个正确的方法。
去找一个测试cpu占用率的函数,然后
循环体内后面加入:
.....
while get_CpuIdle()>40do
Application.processmessage;
....
通过这样来控制cpu占用率。不过这样的话,浪费了大部分循环时间来看cpu占用率 而导致到你自己的函数执行的效率不会那么高。
这个是没办法的,cpu的计算量就这么多,为了顺畅一点倒也值得吧。
说实话,这不是一个好主意。
 
C

cn01574978

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢大家了 我看了一些有关线程的书 可是对线程感觉不是太明白,能用这个循环 举个例子看看吗?
谢谢谢谢啊
有个创建线程的函数 CreateThread 我看的不是太明白 特别是参数传递的问题 如果有多个参数 我怎么才能 传递能
谢谢谢谢 啊.........
 
W

waterspace

Unregistered / Unconfirmed
GUEST, unregistred user!
多个参数就要放在一个类(结构体)里了。有很多语言有自己的线程类,可以继承下该类,把参数放在类的私有变量中
 
C

cn01574978

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好
谢谢你们的回答:我最近看了很多关于线程的书,不过自己看的话 始终不是能看的太明白,你们能举个简单的例子吗?
谢谢谢谢。。。。
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
如果要用线程来处理,建议楼主看看Delphi自带的Help中关于 TThread 的介绍(不要说
你不会用Help)。
从问题的源头来看,这种多层大循环本身应当被极力避免——因为,即便每次循环只产生
1字节的结果,计算机内存也根本不可能容纳——可见这种嵌套循环本身存在的意义就有很
大的疑问。如果楼主能够通过理顺思路,将总循环次数控制在计算机内存字节数的数量级之
内,我以为此时再谈响应界面消息乃至放到线程中执行才有实际价值。
 
G

GodIsWrong

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上的 高人啊
pf
 
U

ufo

Unregistered / Unconfirmed
GUEST, unregistred user!
如果这个代码是偶尔运行的,那么用
Application.processmessage 来活动一下程序界面是可行的,比如更新一下进度条
而要降低cpu,那么用sleep(一个大于零的数值)
程序运行到sleep时,会切换到内核模式,并进入等待状态,过一段时间(不一定是你在sleep内设定的参数值。这个系统不能保证)再次唤醒你的代码继续运行。
如果再创建一个新线程,如果是默认优先级的,那么cpu的占用还是不会降低的。因为操作系统会不停的给cpu以满足需求。
 
J

jmh521

Unregistered / Unconfirmed
GUEST, unregistred user!
学习....学习...
 
L

lizhijie98

Unregistered / Unconfirmed
GUEST, unregistred user!
application.processmessges
这种科学计算的问题 就是吃CPU的 没有办法
只有算法优化才能避免
 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!
var a:dword;
a:=0;
For i:=0 to 10000do

For j:=0 to 10000do
begin
For k:=0 to 10000do
begin
Procedure(i,j,k);

a:=a+1;
if (a mod 100)=0 then
sleep(1);
end;
end;
 
G

GodIsWrong

Unregistered / Unconfirmed
GUEST, unregistred user!
时间片问题,需要动态的修改时间片的占用优先级
 

Similar threads

回复
0
查看
644
不得闲
回复
0
查看
672
不得闲
S
回复
0
查看
945
SUNSTONE的Delphi笔记
S
S
回复
0
查看
766
SUNSTONE的Delphi笔记
S
顶部