

お世話になります。
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も見ています
-
VB.NETでボタンのクリックイベントハンドラが2回実行される
Visual Basic(VBA)
-
C#でボタンクリックをキャンセル
C言語・C++・C#
-
エディットボックスの入力制限について
C言語・C++・C#
-
-
4
CString から LPCTSTRの型に変換
C言語・C++・C#
-
5
.NET(VB)でボタンの連打を防止する方法
その他(プログラミング・Web制作)
-
6
マウス・キーボード入力を禁止させたい。
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
マウスのクリックを無視したい
C言語・C++・C#
-
9
VB2005 DataGridView上でクリックを無効にする方法はありますか?
Visual Basic(VBA)
-
10
DataGridViewの、選択されている行を取り出したい
Visual Basic(VBA)
-
11
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
12
ボタンをマウスで押し続けたときのイベント
Visual Basic(VBA)
-
13
プログラムからアイコンファイルの作成
C言語・C++・C#
-
14
CloseとDisposeの違い
Visual Basic(VBA)
-
15
.NETアプリを作ったときの .manifest ファイルって必要なの
C言語・C++・C#
-
16
C#プログラムで、ボタンをショートカットキー付きで作りたいのですが、方
その他(プログラミング・Web制作)
-
17
ComboBoxのフォーカスをはずす
C言語・C++・C#
-
18
C# 超初心者です。 this.Refresh();という文を使いたいです
C言語・C++・C#
-
19
C# DataGridView の列ヘッダーのマウス右クリックイベントにつきまして
C言語・C++・C#
-
20
c# 文字列の最後から1文字削除したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
DoEventsがやはり分からない
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
EXCEL VBA マクロ 実行する度に...
-
VBの質問#if 0 then ってどう...
-
銀行の窓口処理の件で知ってる...
-
UMLでの例外処理
-
月度は何て読みますか?
-
VB.NET Excelを読み込んでDataT...
-
VBAでCOPYを繰り返すと、処理が...
-
NULLを含むフィールド値の条件分岐
-
waitせずにキー入力があった場...
-
インタラクティブの反対語は?
-
vba 空のデータをSplitする時の...
-
VB6のMSFlexGridでセルをマージ...
-
[VB.NET]Windowsアプリに、Page...
-
switch の範囲指定
-
C# 二次元配列 ドット絵の表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
銀行の窓口処理の件で知ってる...
-
VBAでCOPYを繰り返すと、処理が...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
VBの質問#if 0 then ってどう...
-
月度は何て読みますか?
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
switch の範囲指定
-
メルカリのメルカードで買い物...
-
DoEventsがやはり分からない
-
お家デートをしててハグを長い...
-
セックスレスの既婚女性は自慰...
-
リョウ・・・量?料?
-
findは動くがfindnextがマクロ...
-
取り消し線が入った文字を削除...
-
生活保護受給者は性欲をどんな...
-
Loadイベント中にほかのイベン...
おすすめ情報