線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1692
推到 Plurk!
推到 Facebook!

关于有条件的循环的错误问题

答題得分者是:tuga
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-06-19 23:39:02 IP:58.247.xxx.xxx 訂閱
 原来的写法,CPU占有率太高。想换个新方法来,但是却老是不行。是不是语句的位置放错了?

[code delphi]
begin
// form1.AdjustToken ;
Found := False;
form1.ClientDataSet2.DisableControls;
try
form1.clientdataset2.edit;
form1.ClientDataSet2.First;
while (not form1.ClientDataSet2.Eof) and (not Found) do
begin
if ((form1.ClientDataSet2.FieldByName('xx').asstring='') and (FormatDateTime('hh:mm:ss',form1.ClientDataSet2.FieldByName('开始时间').asdatetime) = formatdatetime('hh:mm:ss',now)))
or ((form1.ClientDataSet2.FieldByName('xx').asstring<>'') and (FormatDateTime('dddd',now)=form1.ClientDataSet2.FieldByName('周期').asstring)
and (FormatDateTime('hh:mm:ss',form1.ClientDataSet2.FieldByName('开始时间').asdatetime) = formatdatetime('hh:mm:ss',now))) then
begin
.....
[/code]
关于条件的筛选,我用了
if form1.ClientDataSet2.FieldByName('计划类型').AsString <>'' then,
begin

//这句放哪里呢?我放在while 内部和外部,他们都会死循环。直到死机,什么原因啊
...



------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-06-20 12:38:54 IP:210.61.xxx.xxx 未訂閱
1.請po上完整的Code,有頭無尾的,沒人知道問題在哪裡...
2.如有無窮迴圈,請進行Debug看問題是出在哪...

編輯記錄
老大仔 重新編輯於 2013-06-20 12:39:21, 註解 無‧
tuga
高階會員


發表:16
回覆:109
積分:120
註冊:2002-07-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-06-20 13:30:19 IP:1.34.xxx.xxx 訂閱
迴圈前先執行這個
ClientDataSet2.IndexName := '';

你的排版要處理一下, 實在看不懂,

zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-06-20 16:27:51 IP:116.239.xxx.xxx 訂閱
procedure Day
var
Found: Boolean;

begin
Found := False;
form1.ClientDataSet2.DisableControls;
try
form1.clientdataset2.edit;
form1.ClientDataSet2.First;
while (not form1.ClientDataSet2.Eof) and (not Found) do
begin
if ((form1.ClientDataSet2.FieldByName('周期').asstring='') and
(FormatDateTime('hh:mm:ss',form1.ClientDataSet2.FieldByName('开始时间').asdatetime) = formatdatetime('hh:mm:ss',now)))
then
begin
Found := True;
....
end;
form1.ClientDataSet2.Next;
end;
finally
form1.ClientDataSet2.EnableControls;
end;

这个过程没问题,但是CPU占有率太高,我想在添加一个循环条件。if clientdataset1.fieldbyname('xx').asstring<>'', 就是不知道应该把这条语句添加在哪里
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
編輯記錄
zhouying82 重新編輯於 2013-06-20 16:28:41, 註解 無‧
zhouying82 重新編輯於 2013-06-20 16:29:11, 註解 無‧
tuga
高階會員


發表:16
回覆:109
積分:120
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-06-20 17:03:49 IP:1.34.xxx.xxx 訂閱
你的問題可能會出在 

1 迴圈裏面每一筆都會執行 begin end 裡面的東西, 如果筆數多, 當然慢
2 當你的迴圈裡面的有 edit, post, 改變了 資料排列的順序, 有可能會意外造成迴圈數增加



begin
Found := True;
....
end;
form1.ClientDataSet2.Next;


P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-06-20 22:59:29 IP:118.160.xxx.xxx 未訂閱
有一點疑問, 
formatdatetime('hh:mm:ss',now
你使用了這段做為判斷, 但 now 是一個隨時在變化的時間變數,
我不知道右側你要判斷的是什麼"週期時間",
可是找的直覺是, 使用now 能比對出令 found:= True 旳結果嗎?
死機的原因是否是這裡?

===================引 用 zhouying82 文 章===================
procedure Day
var
Found: Boolean;

begin
Found := False;
form1.ClientDataSet2.DisableControls;
try
form1.clientdataset2.edit;
form1.ClientDataSet2.First;
while (not form1.ClientDataSet2.Eof) and (not Found) do
begin
if ((form1.ClientDataSet2.FieldByName('周期').asstring='') and
(FormatDateTime('hh:mm:ss',form1.ClientDataSet2.FieldByName('开始时间').asdatetime) = formatdatetime('hh:mm:ss',now)))
then
begin
Found := True;
....
end;
form1.ClientDataSet2.Next;
end;
finally
form1.ClientDataSet2.EnableControls;
end;

这个过程没问题,但是CPU占有率太高,我想在添加一个循环条件。if clientdataset1.fieldbyname('xx').asstring<>'', 就是不知道应该把这条语句添加在哪里
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-06-22 21:43:58 IP:58.247.xxx.xxx 訂閱
 首先感谢大大,因为我是把这个过程放在线程的ontimer时间中,所以运行是没有问题,但是就是CPU占有率太高,如果再添加个判断条件
if clientdataset1.fieldbyname('xx').asstring.进去的话,CPU会迅速为0.但是随之而来的就是程序执行不起错误,所以,我就在问,这个语句应该是放在那里?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
tuga
高階會員


發表:16
回覆:109
積分:120
註冊:2002-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2013-06-22 23:23:19 IP:114.25.xxx.xxx 訂閱
你的程式會當掉, 想必跟你 while 內程式,  clientdataset 的 index 的順序有關
從你 po 的 部分的 code 來看, 無法判斷


zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2013-06-24 14:17:48 IP:116.239.xxx.xxx 訂閱
回大大,程序不会当掉,而且运行完美,只是CPU占用率会很高,我的目的只是想要降低CPU的占用率而已。
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
tuga
高階會員


發表:16
回覆:109
積分:120
註冊:2002-07-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2013-06-24 15:11:26 IP:1.34.xxx.xxx 訂閱
執行 tread 時, 寫入一個文字檔, 紀錄執行的紀錄與時間, 就知道 cpu 是為什麼 loading 會高了
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2013-06-26 10:44:11 IP:116.239.xxx.xxx 訂閱
兄弟,可以给个例子么
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
tuga
高階會員


發表:16
回覆:109
積分:120
註冊:2002-07-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2013-06-26 13:13:12 IP:1.34.xxx.xxx 訂閱
procedure log_it(strMessage:string);
var hErrorLog:TextFile;
strLogFileName:String;
begin
strLogFileName:=ExtractFilePath(Application.ExeName) formatdatetime('yyyymmdd',now) '.txt';
if not FileExists(strLogFileName) then
begin
AssignFile(hErrorLog,strLogFileName);
ReWrite(hErrorLog);
WriteLn(hErrorLog,'Start Here');
CloseFile(hErrorLog);
end;
AssignFile(hErrorLog,strLogFileName);
Append(hErrorLog);
WriteLn(hErrorLog,DateTimeToStr(Now) ',' strMessage);
CloseFile(hErrorLog);
end;

系統時間:2024-04-25 19:41:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!