Delphi For循环占用CPU100%释放问题

Mit1208 2008-12-07 08:57:10
var
i,j:integer;
for i:=memo1.lines.count-1 downto 0 do
begin
for j:=i-1 downto 0 do
begin
if comparestr(memo1.lines.strings[i],memo1.lines.strings[j])=0 then
begin

memo1.lines.delete(i);
break;
end;
end;
end;


用这个For循环,如果去重复字符串多的话..一直循环,占用CPU100%,速度很慢,请问怎么才能去一个重复字符串后释放一下CPU呢.或者让CPU不到100%..多线程应该可以吧?可是现在学的是基础,还不会.请哪位高手老师指导一下解决这个的方法
...全文
489 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mit1208 2008-12-12
  • 打赏
  • 举报
回复
程序....现在已经可以了.!
原来是sleep(1)
要加在最里边那个循环里..
每个朋友都回答技术知识.我都给点分吧..
不好意思.
jadeluo 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 LoveMit 的回复:]
引用 18 楼 sparklerl 的回复:
上面那个应该是
application.ProcessMessages

少了个S


这个是小问题.主要的是解决不了我的问题啊!
[/Quote]

换下面的代码试试, 你原来的算法有些问题:

begin
Memo1.Lines.BeginUpdate;
i := 0;
while i < Memo1.Lines.Count do
begin
j := i + 1;
while j < Memo1.Lines.Count do
begin
if CompareStr(Memo1.Lines.Strings[i], Memo1.Lines.Strings[j]) = 0 then
Memo1.Lines.Delete(j)
else
inc (j);
end;
Application.ProcessMessages;
Sleep(1);
inc (i);
end;
Memo1.lines.endupdate;
end;
Mit1208 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sparklerl 的回复:]
上面那个应该是
application.ProcessMessages

少了个S
[/Quote]

这个是小问题.主要的是解决不了我的问题啊!
sparklerl 2008-12-11
  • 打赏
  • 举报
回复
上面那个应该是
application.ProcessMessages

少了个S
sparklerl 2008-12-11
  • 打赏
  • 举报
回复

i:= memo1.lines.count;
while i>=1 do
begin
j:=i-1;
while j>=0 do
begin
if comparestr(memo1.lines.strings[i],memo1.lines.strings[j])=0 then
begin
memo1.lines.delete(i);
i:=i-1;
end ;
application.processmessage;
j:=j-1;
end;
i:=i-1
end;


我的循环,

你循环里面的Break之后

外层循环对你前面比较过的行又进行了一次比较,这样效率好像低了
Mit1208 2008-12-11
  • 打赏
  • 举报
回复
楼上朋友..我是用的反向.正如12楼朋友所说.
我代码已经改过了..还没有测试.!
如果真的可以..一定回报各位!
还有13楼的朋友.
如果是死循环的话...那循环还会停止嘛?
我的这个源码是去重复字符串的.
如果字符串少的话. .根本没问题.而已能正常去除重复的!
就是字符串一超过1000或者多一些.CPU使用率会慢慢增大!
机器也就卡了.程序运行速度也就慢了的
bdmh 2008-12-11
  • 打赏
  • 举报
回复
如果对一个列表进行删除操作,记住一定要反向循环,否则你每删除一个,count就会变化,很容易引起错误的
ajiwuweibin 2008-12-10
  • 打赏
  • 举报
回复
不用看了,CPU100%肯定是死循环,而且你那样写本来就有问题
jadeluo 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ajiwuweibin 的回复:]
不用看了,CPU100%肯定是死循环,而且你那样写本来就有问题
[/Quote]

1. CPU 100%,不一定是死循环,例如:

repeat
until FormatDateTime('HH:NN', Now()) = '14:00';



2. 死循环,CPU不一定是100%,例如:

repeat
Sleep(1);
until False;
jadeluo 2008-12-09
  • 打赏
  • 举报
回复
把application.processmessage和Sleep(1)放在第一层循环里,否则有可能永远执行不到它们的。


var
i,j:integer;
...
memo1.lines.beginupdate;
for i := memo1.lines.count - 1 downto 0 do
begin
for j := i - 1 downto 0 do
begin
if comparestr(memo1.lines.strings[i],memo1.lines.strings[j]) = 0 then
begin
memo1.lines.delete(i);
break;
end;
end;
application.processmessage;
Sleep(1);
end;
memo1.lines.endupdate;
AirFish 2008-12-09
  • 打赏
  • 举报
回复
sleep不行吗?
Mit1208 2008-12-09
  • 打赏
  • 举报
回复
go on up
keyz 2008-12-08
  • 打赏
  • 举报
回复
sleep 啊
阿三 2008-12-08
  • 打赏
  • 举报
回复
将memo1中的内容加载到内存中进行处理,然后再处理,最后再将memo1内容更新。
tjg5202 2008-12-08
  • 打赏
  • 举报
回复
那就从程序本身方面去尝试优化吧
filec75 2008-12-08
  • 打赏
  • 举报
回复
友情up
Mit1208 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zxf_feng 的回复:]
将memo1中的内容加载到内存中进行处理,然后再处理,最后再将memo1内容更新。
[/Quote]

这个怎么操作,能否修改一下源码,贴出来? 3Q
Mit1208 2008-12-07
  • 打赏
  • 举报
回复
谢谢各位的回答.我会尝试你们提供的方法的!

还有application.processmessage这个我在程序中使用了

但只能在For循环运行的同时可以操作界面其它按钮

并不能减底CPU使用率的!
keyz 2008-12-07
  • 打赏
  • 举报
回复
需要释放cpu的话,可以用 sleep,如 sleep(1),但是会降低效率

需要界面响应的话,可以用 application.processmessage

多线程不能解决cpu占满的情况。
僵哥 2008-12-07
  • 打赏
  • 举报
回复
var
i,j:integer;
...
memo1.lines.beginupdate;
for i:=memo1.lines.count-1 downto 0 do
begin
for j:=i-1 downto 0 do
begin
if comparestr(memo1.lines.strings[i],memo1.lines.strings[j])=0 then
begin

memo1.lines.delete(i);
application.processmessage;
Sleep(1);
break;
end;
end;
end;
memo1.lines.endupdate;
加载更多回复(1)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧