2011-08-05 11 views
1

私は答えを見つけようとしましたが、見つけられませんでした。他のボタンがクリックされていないか確認しています

は、私はこのような何かをしたい:

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

と私がしたい:私はボタンをクリックすると、別のボタンが

をクリックするまで が、私はこのようなものを持っている、それがアクションを繰り返したいです別のボタンをクリックするまで、「if」内でアクションを繰り返す。

誰かが私に教えてもらえますか、これをどのように達成できますか?

答えて

2

ここには2つの可能性があります。 1つは、別のボタンで設定された条件が設定されるまで、スレッドを作成してコードを実行することです。もう1つの可能性は、メッセージポンプが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がイベントを受信したときにのみ有効になります。私の理解は、特定のイベント(ボタン押下)が発生するのを待っている間に何かが起きるようにすることです。このイベント間の時間は「バックグラウンド」時間です。

1つのアイデアは、待機中にWindowsがあなたの関数を実行させることです。ウェブで「Windowsスピンウェイト」を検索します。これは、関数をバックグラウンドまたはスピンウェイトループに "フック"する方法に関する情報を提供します。

バックグラウンドタスクとして別のスレッドを作成することもできます。最初のボタンをクリックしてバックグラウンドスレッドをオンにします。バックグラウンドスレッドは、セマフォまたは待機オブジェクトが設定されるまで実行されます。 2番目のボタンを押すと、これはセマフォー/wait-objectに設定され、バックグラウンドタスクの停止を通知します。同様の方法がありますが、これが問題の基礎です。

+0

具体的にする必要があります。コードサンプルは他の人にとって参考になります。私はボランティアのクラスをすべて知っていない、私を含めてたくさんの人がいると思います。しかしあなたの考えは良いです。 – truthseeker

関連する問題