1

答えを見つけようとしましたが、見つかりませんでした。

次のようなことをしたい:ボタンをクリックすると、別のボタンがクリックされるまでアクションを繰り返したい

私はこのようなものを持っています:

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

別のボタンをクリックするまで、「if」内でアクションを繰り返したい。

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

4

2 に答える 2

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;
}
于 2011-08-05T18:52:12.423 に答える
0

「バックグラウンド」で実行される関数が必要になります。

Windowsはイベント駆動型システムです。関数は、Windowsがイベントを受信したときにのみアクティブになります。私の理解では、特定のイベント(ボタンの押下)が発生するのを待っている間に何かが発生することを望んでいます。イベント間のこの時間は「バックグラウンド」時間です。

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

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

于 2011-08-05T18:44:49.137 に答える