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

Application.ProcessMessage 在 Android 有問題?

尚未結案
blue
中階會員


發表:113
回覆:101
積分:52
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-09-09 17:10:13 IP:122.146.xxx.xxx 訂閱
Hi,各位先進大家好:
一直以來,總覺得 Application.ProcessMessage 在 Android 的應用程式中怪怪的,
小弟原想使用 Application.ProcessMessage的方式等待某些Job完成,卻會造成程式Crash,或無法回應,
例如在 Button1 的 OnClick 中加入
while true do Application.ProcessMessage;
結果按了Button1 後整個程式Hung住了,
謝謝!
pcplayer99
尊榮會員


發表:142
回覆:738
積分:591
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-09-09 19:45:57 IP:183.15.xxx.xxx 訂閱
你的程式陷入死循环了。

while True do
begin
Sleep(100);
Application.ProcessMessage;
end;

让程式暂停一下,再处理消息。这样比较好。你试试看。
blue
中階會員


發表:113
回覆:101
積分:52
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-09-10 14:11:53 IP:122.146.xxx.xxx 訂閱
Hi,感謝 pcplayer99先進的指導,
不過,小弟在Android測試的結果還是一樣,
實在不知問題出在那裏了,
謝謝!

===================引 用 pcplayer99 文 章===================
你的程式陷入死循环了。

while True do
begin
Sleep(100);
Application.ProcessMessage;
end;

让程式暂停一下,再处理消息。这样比较好。你试试看。
pcplayer99
尊榮會員


發表:142
回覆:738
積分:591
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-09-10 21:34:20 IP:183.15.xxx.xxx 訂閱
while true do
begin
Sleep(100);
Application.Processmessage;
if GoExit then Break;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GoExit := True;
end;
P.D.
版主


發表:571
回覆:3881
積分:3666
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-09-11 00:13:48 IP:118.169.xxx.xxx 未訂閱
你使用 while true do ...
這原則上就像樓上網友講的, 限入死胡同了, 即便加 sleep(xxx), 整個系統一樣會被hang住, 因為sleep 本來就是停掉所有運作而計數,
Application.ProcessMessages 不是不能用, 但要小心用, 而且一定是
while xxxx do begin
Application.ProcessMessages;
.....
這裡一定要有出路可以跳出迴圈
end;
所以你的錯誤不在使用 Applicatio...
而是 while True do ... 沒有出路, 當然"當"
===================引 用 blue 文 章===================
Hi,各位先進大家好:
一直以來,總覺得 Application.ProcessMessage 在 Android 的應用程式中怪怪的,
小弟原想使用 Application.ProcessMessage的方式等待某些Job完成,卻會造成程式Crash,或無法回應,
例如在 Button1 的 OnClick 中加入
while true do Application.ProcessMessage;
結果按了Button1 後整個程式Hung住了,
謝謝!
blue
中階會員


發表:113
回覆:101
積分:52
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-09-11 11:17:09 IP:122.146.xxx.xxx 訂閱
Hi,感謝各位先進的指導:
小弟測試了一下,還是Hung了(在Android上),
Button1 按下之後, Button2根本無法按了,
程式如下.
謝謝!
procedure TForm1.Button1Click(Sender: TObject);
begin
while true do begin
sleep(100);
Application.ProcessMessages;
if GoExit then break;
end;
ShowMessage('Exit');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
GoExit := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
GoExit := False;
end;


===================引 用 P.D. 文 章===================
你使用 while true do ...
這原則上就像樓上網友講的, 限入死胡同了, 即便加 sleep(xxx), 整個系統一樣會被hang住, 因為sleep 本來就是停掉所有運作而計數,
Application.ProcessMessages 不是不能用, 但要小心用, 而且一定是
while xxxx do begin
Application.ProcessMessages;
.....
這裡一定要有出路可以跳出迴圈
end;
所以你的錯誤不在使用 Applicatio...
而是 while True do ... 沒有出路, 當然"當"
===================引 用 blue 文 章===================
Hi,各位先進大家好:
一直以來,總覺得 Application.ProcessMessage 在 Android 的應用程式中怪怪的,
小弟原想使用 Application.ProcessMessage的方式等待某些Job完成,卻會造成程式Crash,或無法回應,
例如在 Button1 的 OnClick 中加入
while true do Application.ProcessMessage;
結果按了Button1 後整個程式Hung住了,
謝謝!
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-09-11 12:04:26 IP:202.39.xxx.xxx 訂閱
while true do begin
sleep(100);
Application.ProcessMessages;
if GoExit then break; // 問題在於 Button2Click() 無機會執行, 所以這一句 GoExit 就永遠是 False.
end;

不知您目的何在,通常 Application.ProcessMessages; 只是為了將已執行但尚未顯示於螢幕的資訊強制顯示出來,
故只要執行一次,根本不該放入迴圈中.

blue
中階會員


發表:113
回覆:101
積分:52
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2015-09-11 14:07:38 IP:125.227.xxx.xxx 訂閱
Hi,感謝各位先進的指導:
但,依先前所找到的資料,
Application.ProcessMessage 的功用是應該要能讓 OS 有時間處理其他事件的回應,
以防止系統的資源被 process 獨佔
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=53124
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=28249
這樣子寫, 在Windows App上跑得好好的,
但,為何在 Android 卻是無法正常,

小弟使用 Application.ProcessMessage 的目的是因為 要等另一個 Frame(是 Frame, 不是 Form),
該Frame嵌入 Main form 中,負責 Login認證,等該Frame按下OK or Cancel 才回來,因此要一直等,
謝謝!

===================引 用 herbert2 文 章=================== while true do begin
sleep(100);
Application.ProcessMessages;
if GoExit then break; // 問題在於 Button2Click() 無機會執行, 所以這一句 GoExit 就永遠是 False.
end;

不知您目的何在,通常 Application.ProcessMessages; 只是為了將已執行但尚未顯示於螢幕的資訊強制顯示出來,
故只要執行一次,根本不該放入迴圈中.

blue
中階會員


發表:113
回覆:101
積分:52
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2015-09-11 15:57:14 IP:122.146.xxx.xxx 訂閱
Hi,感謝各位先進指導:
或者,小弟這樣子問,
當各位主程序去啟動一個Thread(例如檢查Internet是否可用)後,
如何等待該檢查完成後繼續處理?
不過,小弟的這個等待Frame的部份因為不是Thread,
好像是不一樣的Case了,
謝謝!
P.D.
版主


發表:571
回覆:3881
積分:3666
註冊:2006-10-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2015-09-11 17:16:28 IP:118.160.xxx.xxx 未訂閱
如果另一支執行序程式不是你寫的, 而是另外的程式, 老實說在WINDOWS上要達成都很難, 何況是Andorid, 應該有解, 我也在期待!
===================引 用 blue 文 章===================
Hi,感謝各位先進指導:
或者,小弟這樣子問,
當各位主程序去啟動一個Thread(例如檢查Internet是否可用)後,
如何等待該檢查完成後繼續處理?
不過,小弟的這個等待Frame的部份因為不是Thread,
好像是不一樣的Case了,
謝謝!
pcplayer99
尊榮會員


發表:142
回覆:738
積分:591
註冊:2003-01-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2015-09-13 23:03:34 IP:183.15.xxx.xxx 訂閱
我觉得你没把问题搞清楚。

1. 如果只是一个死循环的问题,你按照我写的代码去测试,Windows 底下一定能通过。然后你再到 Android 底下去测试看看。我怀疑你是在你的实际代码里测试的,也就是你的测试代码里面,有 Login 的动作,所以才出问题。

2. 你的真实代码里面,有 Login 的动作。这里为什么要写一个 Loop 来等待?除非这个 Login 是另外一个 Thread。

3. 如果你的 Button 是启动另外一个 Thread,然后要等那个 Thread 执行完毕后,再来显示执行结果,那么,你这里应该是按下 Button 后,启动 Thread 然后给自己设置一个状态。在这个状态下,user 再去点这个 Button 就不应该再有动作。而 Login 完成后需要的动作,比如 ShowMessage('恭喜登录成功');这样的 code 应该写到另外一个 Method 里面。这个 Method 应该由 Thread.OnTerminated 这个 Event 来调用。
blue
中階會員


發表:113
回覆:101
積分:52
註冊:2002-04-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2015-09-14 13:57:30 IP:122.146.xxx.xxx 訂閱
Hi,感謝各位先進的指導:
作了一點測試,程式如後,
煩請在 Android 上測試一下,
程式碼就只有這樣,沒有其他加工的,
Button1 按了之後,
Button2 就完全無回應了,
謝謝!
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 1000000 do begin
Label1.Text := IntToStr(i);
if FStop then break;
Application.ProcessMessages;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FStop := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FStop := False;
end;


===================引 用 pcplayer99 文 章===================
我觉得你没把问题搞清楚。

1. 如果只是一个死循环的问题,你按照我写的代码去测试,Windows 底下一定能通过。然后你再到 Android 底下去测试看看。我怀疑你是在你的实际代码里测试的,也就是你的测试代码里面,有 Login 的动作,所以才出问题。

2. 你的真实代码里面,有 Login 的动作。这里为什么要写一个 Loop 来等待?除非这个 Login 是另外一个 Thread。

3. 如果你的 Button 是启动另外一个 Thread,然后要等那个 Thread 执行完毕后,再来显示执行结果,那么,你这里应该是按下 Button 后,启动 Thread 然后给自己设置一个状态。在这个状态下,user 再去点这个 Button 就不应该再有动作。而 Login 完成后需要的动作,比如 ShowMessage('恭喜登录成功');这样的 code 应该写到另外一个 Method 里面。这个 Method 应该由 Thread.OnTerminated 这个 Event 来调用。
系統時間:2017-10-23 19:27:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!