dポイントプレゼントキャンペーン実施中!

お世話になります。
C#2005で開発をしております。

ボタンクリックイベントを使用しておりますが、最初のボタンクリックイベントを実行中に、同じボタンをクリックると、複数のボタンクリックイベントが発生してしまいます。
ボタンクリックイベントが複数走らないようにしたいのですが、どのようにして防止するとよいか苦慮しております。

主なコードを以下に記述致します。
------------------------------------------------------------------------------------
bool bButtonPushFlg = false;
private void bShtter1_Click(object sender, EventArgs e)
{
if (bButtonPushFlg == true) return;
bButtonPushFlg = true;
Application.DoEvents();

bShtter1.Click -= new EventHandler(bShtter1_Click);

// 関数
aaaaa()

bShtter1.Click += new EventHandler(bShtter1_Click);
bButtonPushFlg = false;
}

private int aaaaa()
{
Thread thread;
thread = new Thread(new ThreadStart(bbbbb));
thread.Start();
}

private int bbbbb()
{
----------------
スレッド処理内容
----------------
}
------------------------------------------------------------------------------------


恐れ入りますが、ご教示いただきたく、宜しくお願い申し上げます。


以上です。

A 回答 (3件)

基本は


・Enabledをfalseに設定することでそれ以降のクリック自体を無効化する
・処理終了後にEnabledをtrueに設定して,クリックを有効にする
で対応します。

ただし,短い処理の場合はこれで対応できないこともあるので,500ms以内の連続クリックは無効にする,といった処理が必要になるでしょう。


で,今回に関しては,

private void bShtter1_Click(object sender, EventArgs e)
{
bShtter1.Enabled = false;
try
{
aaaaa();
}
catch
(
bShtter1.Enabled = true;
throw;
}
}
/* aaaaaはそのまま */

private int bbbbb()
{
try
{
/* 既存の処理内容 */
}
finally
{
if (InvokeRequired)
{
Invoke((Action<object>)delegate (object dummy) { bShtter1.Enabled = true; }, null);
else
{
bShtter1.Enabled = true;
}
}
}
といった処理になるかと思います。

ただ,本当にThreadオブジェクトが必要ですか,という話は出てきます。
System.ComponentModel.BackgroundWorker (.NET Framework 2.0-)を使えば,
private void bShtter1_Click(object sender, EventArgs e)
{
bShtter1.Enabled = false;
backgroundWorker1.RunWorkAsync();
}

private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e)
{
// 元のbbbbbの内容をそのまま
}

private void backgroundWorker1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
{
bShtter1.Enabled = true;
}
のように,Invoke使ったり細々した処理が消えます。

また,デリゲートのBeginInvokeによる非同期処理(スレッドプール利用)も存在するため (.NET Framework 1.0-),
Threadクラスを直接使うメリットは.NET Framework 1.0の頃からほぼ無いです。
# .NET Framework 4ではSystem.Threading.TaskやPLINQを使うことも。
    • good
    • 1
この回答へのお礼

御回答ありがとうございます。またご返答おそくなりまして申し訳ございません。

対処として、
・Enabledをfalseに設定することでそれ以降のクリック自体を無効化する
・処理終了後にEnabledをtrueに設定して,クリックを有効にする
に加え、
Doevnetsを入れて対応いたしました。

本来なら、ご教示いただいたとおりbackgroundWorkerを使用して行いたかったのですが、時間的に厳しく、さしあたり上記で動作したもので対応しました。

今後の処理向上として、後日backgroundWorkerを使用して、コーディングを行いたいと思います。

ご教示誠にありがとうございました。

以上です。

お礼日時:2011/10/31 09:26

C#は触ったこと無いですが、ボタンクリックのタイミングでフラグを立てて、フラグが立っているときに、ボタンをクリックしてもはねれば良

いだけでは?
    • good
    • 0

C#は触ったことありませんが…



処理自体はワーカースレッドでやっているようなのでUIが止まる。ということはなさそうですね。
ということで、2回目(というか複数回)押されたくないのであれば…
ボタンクリックでコールされたときに、そのボタンを無効化してしまえばよいかと。
ワーカースレッドの処理が終わった後、ボタンを有効化する。
というのが一般的ですかね。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A