2012-02-24 38 views
0

私はいくつかのボタンがあるフォームを持っています。ユーザーがボタンの1つを押すと、長いプロセスを開始します(数秒かかる)。私がしたいのは、最初のボタンを押してからプロセスが完了するまで、フォーム上の他のボタンで発生するそれ以降のボタン・プレスは無視されるということです。実際には、後続のボタン押下が待ち行列に入り、各完了のプロセスとして順番に実行されます。私の言うことは、各ボタンが2秒かかる機能を実行し、5秒間に非常に迅速に(2秒未満で)ボタンを押すと、10秒かかるイベントのシーケンスにつながります....私は何をしたいですか最初のボタンが押されただけで、2秒かかると機能が作動します。VB.netでビジー状態のときのイベント処理を抑制する

私はUSB to UARTコンバータを介してハードウェアとインターフェースするソフトウェアを作成しており、仮想COMポートとタイミングを使用しています。私は、ボタンを押したときにのみ何かが起きるようにしたい。キューに入ってから前の操作が完了するのを待ってから数秒後ではない。

答えて

1

より難しいが、実り、アプローチはBackgroundWorker糸を切っ忙しい仕事を動かすことであるのに役立ちます願っています。以前の要求を処理している間にユーザーが行うことを制限するために、フォーム上のコントロールを管理する必要がありますが、手作業で作業を完了しながらフォームを再描画して処理することもできます。

+0

これを試してみましょう。以前はバックグラウンドワーカークラスを使用しました。 – CHollman82

+0

これは、私が探していた振る舞いを与えました。 – CHollman82

0

長時間実行するアクションを開始するときにすべてのボタンを無効にし、終了時に再び有効にすることを検討しますか?

+0

私はそれを試みました。それは視覚的な「不具合」につながります。ボタンを無効にすると、ぼんやりとしてしまいます.2ダースのボタンをすばやく無効にして再度有効にすると、「間違っている」ように見えます。しかし、オプションのおかげで、私は最後の手段と考えています – CHollman82

+0

ボタンをパネルに置き、パネルを無効にするとどうなりますか?ボタンはまだ無効になっていますか?また、詳細を忘れていますが、すべてのボタンを無効にしている間に描画を抑制する方法はありません。 –

0

これを行うにはいくつかの方法があります。最も簡単なのは最初のボタンがクリックされたときに、プロセスが完了したときにtrueに戻って、その後、falseにフォームのEnabledプロパティを設定することが考えられます:

あなたは.NETでキューを使用するために、私はsugget
Try 
    this.Enabled = False; 
    ... do your work 
Finally 
    this.Enabled = True; 
End Try 
+0

これは、suspendlayoutとresumelayoutを使ってもひどいです(これは私が期待するようには動作していません...) – CHollman82

0

..

各プロセスを終了した後、すべてのプロセスがコマンドをデキューし、さらにコマンドまたは操作の操作がある場合はキューをチェックします。

これにより、ボタンを無効にして再度有効にすることはできません。

私は、これは

+0

良いオプションのようですが、前のものがなくなるまでイベントを取得しません終了しました...まず、アプリケーションがビジーであることを示すブール値フラグを使用しようとしましたが、各イベントでこのフラグをテストして設定して適切にクリアしましたが、以前の長い操作が終了するまで、イベントハンドラ自体は呼び出されないからです。イベントのエンキューは、私がアクセスしていない場面の裏に発生します。 – CHollman82

関連する問題