[問題] BCB6小問題...

看板C_and_CPP作者 (工友棋)時間13年前 (2012/04/05 21:08), 編輯推噓3(3025)
留言28則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) BCB6 問題(Question): 請問有方法能夠讓Timer跑完後才繼續做其他的程式碼嗎?最近在做河內塔的 模擬,程式碼的部分都ok了。可是在顯示方面,我想以「移動盤子」來呈現 而不是點"下一步"(ShowMessage)後盤子直接跑到另一個柱子,目前的狀況是 ,如果我不用ShowMessage來讓它在移動過程中暫停的話,它只會跑第一次就 停住了。 自己想出的原因是因為在Timer跑的過程中剩餘程式碼已經跑完了 囧" 所以想請教一下,有方法能讓程式在Timer跑的過程中先暫停不繼續執行嗎QQ? --

01/20 22:09,
我畢旅的時候 還沒蓋萬里長城呢 哼哼
01/20 22:09
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.105.158.119

04/06 11:43, , 1F
設個flag 或許可以達到你的需求
04/06 11:43, 1F

04/06 12:15, , 2F
timer1->Disable() 要用時再 ->Enable()
04/06 12:15, 2F

04/06 15:14, , 3F
嗯...一樓是指在程式碼前面用紅色標籤那個嗎QQ? 那樣的話
04/06 15:14, 3F

04/06 15:14, , 4F
反而看不到盤子的移動了 囧"
04/06 15:14, 4F

04/06 15:15, , 5F
二樓的寫法我用的話會顯示"Disable" is not a member of
04/06 15:15, 5F

04/06 15:16, , 6F
"T Timer" Enable一樣,如果是設Enabled的true跟false的話
04/06 15:16, 6F

04/06 15:17, , 7F
我有設了QQ" 我現在的問題是我的timer再跑的時候其他程式
04/06 15:17, 7F

04/06 15:18, , 8F
碼也在執行,導致第一個盤子移動完後 程式碼都跑完了,所
04/06 15:18, 8F

04/06 15:18, , 9F
以後面的盤子都不會移動...
04/06 15:18, 9F

04/06 15:58, , 10F
紅色標籤是breakpoint吧…
04/06 15:58, 10F

04/06 16:14, , 11F
是喔 見笑了 囧" 那flag要怎麼用QQ"
04/06 16:14, 11F

04/06 16:18, , 12F
嗯...估狗了一下...發現可能也不是我要的東西XD"
04/06 16:18, 12F

04/06 19:03, , 13F
Timer1->Enabled=true; Timer1->Enabled=false;
04/06 19:03, 13F

04/06 19:03, , 14F
當我沒說QQ
04/06 19:03, 14F

04/06 22:05, , 15F
Timer的功能已經有點類似thread…所以你的主程式還是會繼續
04/06 22:05, 15F

04/06 22:06, , 16F
是否考慮過把Timer做的事改成 Function...這樣才有機會等
04/06 22:06, 16F

04/06 22:07, , 17F
function 執行完後,繼續跑你的主程式...
04/06 22:07, 17F

04/06 23:47, , 18F
可是我的timer是用來移動盤子...能改成Function嗎 囧"
04/06 23:47, 18F

04/06 23:55, , 19F
你用Timer來移動盤子是為了要計算 "多久盤子動一次"嗎?
04/06 23:55, 19F

04/06 23:57, , 20F
如果是…改成用while + sleep...自己控制多久動一次
04/06 23:57, 20F

04/07 00:54, , 21F
試了一下,這樣用會變成過一會後所有盤子直接跳到終點,沒
04/07 00:54, 21F

04/07 00:54, , 22F
有移動的效果耶@@"
04/07 00:54, 22F

04/07 20:38, , 23F
你的程式組織大概是怎樣?
04/07 20:38, 23F
取一部分的程式..... void Hanoimove(int n,int A,int B,int C){ if(!n){ }else{ } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender){ Button3->Enabled=false; Hanoimove(n-1,A,B,C); Button4->Enabled=true; } //--------------------------------------------------------------------------- move(n,C)主要是設定一些參數然後就開啟timer了.... ※ 編輯: t52101t 來自: 120.105.158.119 (04/07 21:21)

04/07 22:42, , 24F
把廢時工作交給執行緒,或者在 Honamove 內插入一些
04/07 22:42, 24F

04/07 22:43, , 25F
Applicaiton->ProcessMessages 才會看到移動
04/07 22:43, 25F

04/07 22:43, , 26F
ShowMessage 因為會去處理訊息所以會看到動的效果
04/07 22:43, 26F

04/07 22:44, , 27F
這些都是跟訊息迴圈(message loop)的觀念有關
04/07 22:44, 27F

04/07 22:46, , 28F
BTW,交給執行緒的話,引發的問題是不能跨執行緒存取 UI
04/07 22:46, 28F
感謝這位大大! 因為一些原因先把副程式內的程式碼刪掉XD" ※ 編輯: t52101t 來自: 120.105.158.119 (04/07 23:07)
文章代碼(AID): #1FVWdh51 (C_and_CPP)