

お世話になります。
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()
{
----------------
スレッド処理内容
----------------
}
------------------------------------------------------------------------------------
恐れ入りますが、ご教示いただきたく、宜しくお願い申し上げます。
以上です。
No.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を使うことも。
御回答ありがとうございます。またご返答おそくなりまして申し訳ございません。
対処として、
・Enabledをfalseに設定することでそれ以降のクリック自体を無効化する
・処理終了後にEnabledをtrueに設定して,クリックを有効にする
に加え、
Doevnetsを入れて対応いたしました。
本来なら、ご教示いただいたとおりbackgroundWorkerを使用して行いたかったのですが、時間的に厳しく、さしあたり上記で動作したもので対応しました。
今後の処理向上として、後日backgroundWorkerを使用して、コーディングを行いたいと思います。
ご教示誠にありがとうございました。
以上です。
No.1
- 回答日時:
C#は触ったことありませんが…
処理自体はワーカースレッドでやっているようなのでUIが止まる。ということはなさそうですね。
ということで、2回目(というか複数回)押されたくないのであれば…
ボタンクリックでコールされたときに、そのボタンを無効化してしまえばよいかと。
ワーカースレッドの処理が終わった後、ボタンを有効化する。
というのが一般的ですかね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C++での連続した左クリックの禁止の仕方について
C言語・C++・C#
-
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
.NET(VB)でボタンの連打を防止する方法
その他(プログラミング・Web制作)
-
4
CloseとDisposeの違い
Visual Basic(VBA)
-
5
DoEventsがやはり分からない
Visual Basic(VBA)
-
6
ボタン2回押しを無効にしたい
JavaScript
-
7
C# 計算処理中に実行中ウィンドウを表示させたい。
C言語・C++・C#
-
8
ユーザコントロールのイベント取得について(C#)
その他(プログラミング・Web制作)
-
9
Debug Assertion Failed?
C言語・C++・C#
-
10
C#で親にイベントを投げる方法
C言語・C++・C#
-
11
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
12
ピクチャーボックスの大きさに合わせて画像を表示
Visual Basic(VBA)
-
13
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
14
VB.NET DataGridView 縦スクロールバーを常に表示
Visual Basic(VBA)
-
15
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
16
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
17
C# ユーザコントロール内のボタン押下を親で知る
その他(プログラミング・Web制作)
-
18
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
19
C#の質問です
C言語・C++・C#
-
20
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
VBAでループ内で使う変数名を可...
-
5
音声マークを一括非表示にしたい。
-
6
セルの値が0はクリアするマクロ
-
7
FFTの結果ついて
-
8
ビープ音を連続して鳴らす
-
9
レジ返品交換について(時間がか...
-
10
Do~Loopした回数をカウントしたい
-
11
DoEventsがやはり分からない
-
12
VBの質問#if 0 then ってどう...
-
13
findは動くがfindnextがマクロ...
-
14
EXCEL VBA マクロ 実行する度に...
-
15
UMLでの例外処理
-
16
switch の範囲指定
-
17
蟻酸の処理について
-
18
2重のDo~Loopは?
-
19
VBAでセルに値が入力されるまで...
-
20
VB.NET Excelを読み込んでDataT...
おすすめ情報
公式facebook
公式twitter