2011-08-05 104 views
1

我試圖找到答案,但我沒有找到答案。檢查是否有其他按鈕被點擊

我想要做這樣的事情: 當我點擊按鈕,我想它重複動作直到另一個按鈕被點擊

我有這樣的事情:

void __fastcall TForm1::BitBtn1Click(TObject *Sender) 
{ 
    if(pole!=NULL){ 
      pole->przesun_lidera(pole->wladca); 
      pole->rozstaw(); 
      pole->rysuj_plansze(); 
    } 
} 

,我想重複「如果」內的動作,直到我點擊另一個按鈕。

有人可以告訴我,我該怎麼做到這一點?

回答

2

我想你在這裏有兩種可能性。一種是製作一個線程並在其中執行代碼,直到由另一個按鈕設置的條件爲止。另一種可能性是通過調用ProcessMessages(),例如允許消息泵在循環內部處理消息。

void __fastcall TForm1::BitBtn1Click(TObject *Sender) 
{ 
    condition = false; 
    while(!condition && pole!=NULL){ 
      pole->przesun_lidera(pole->wladca); 
      pole->rozstaw(); 
      pole->rysuj_plansze(); 
      Application->ProcessMessages(); 
      Sleep(1); // don't be a processor hog 
    } 
} 

void __fastcall TForm1::BitBtn2Click(TObject *Sender) 
{ 
    condition = true; 
} 
+0

非常感謝您的回答 - 它解決了我的問題:) – rukya

+0

請注意,ProcessMessages()可以是可重入的 - 即用戶可以導致任何正常事件發生,因此他們可以點擊兩次按鈕,關閉程序等等。這個解決方案可以工作,但你應該意識到它可能導致的問題,而後臺線程將會是一個更清潔的更復雜的解決方案。 –

+0

我同意David M.看看TEvent。 – Sam

0

您需要有一個在「背景」中執行的功能。

Windows是一個事件驅動系統。您的功能僅在Windows收到事件時激活。我的理解是,您希望在等待特定事件(按下按鈕)時發生某些事情。事件之間的這段時間是「背景」時間。

一個想法是讓Windows在等待時執行您的功能。在網上搜索「Windows旋轉等待」。這將爲您提供有關如何將函數「掛接」到背景或旋轉等待循環的信息。

您可能還想創建另一個線程作爲後臺任務。讓第一個按鈕點擊後臺線程。後臺線程將執行,直到信號量等待對象被設置。第二個按鈕按下會設置這個信號量/等待對象,通知後臺任務停止。有類似的方法,但這是問題的基礎。

+0

你應該更具體。代碼示例會對其他人有所幫助。我認爲有很多人,包括我不瞭解所有Borland課程以及如何使用它。但你的想法很好。 – truthseeker