

お世話になります。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
このQ&Aを見た人はこんなQ&Aも見ています
-
VB.NETでボタンのクリックイベントハンドラが2回実行される
Visual Basic(VBA)
-
マウスのクリックを無視したい
C言語・C++・C#
-
【MFC】イベントの無効化について
C言語・C++・C#
-
-
4
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
5
CString から LPCTSTRの型に変換
C言語・C++・C#
-
6
.NET(VB)でボタンの連打を防止する方法
その他(プログラミング・Web制作)
-
7
CWnd::EnableWindow()の扱い方
C言語・C++・C#
-
8
テキストボックスからフォーカス外す
C言語・C++・C#
-
9
charからLPTSTRへの変換方法
C言語・C++・C#
-
10
マウス・キーボード入力を禁止させたい。
C言語・C++・C#
-
11
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
12
ConnectNamedPipeの接続待ち
C言語・C++・C#
-
13
CStringをwchar_tに変換したい
C言語・C++・C#
-
14
C#でボタンクリックをキャンセル
C言語・C++・C#
-
15
エディットボックスの入力制限について
C言語・C++・C#
-
16
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
17
C++での連続した左クリックの禁止の仕方について
C言語・C++・C#
-
18
別のフォームで記述している関数を実行するには?C#
C言語・C++・C#
-
19
非ブロッキングソケットのrecvについて
C言語・C++・C#
-
20
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
お家デートをしててハグを長い...
-
内部処理形式ってなんですか
-
エクセルで、日付を入力すると...
-
英語の知識があって、数学の知...
-
皆さんが1番信じているものはな...
-
「ご処理進めて頂きますようお...
-
VBA Progress barが動作しない
-
カスタムドロー
-
VBAでCOPYを繰り返すと、処理が...
-
計算の問題なのですが、 例えば...
-
VBAでループ内で使う変数名を可...
-
インタラクティブの反対語は?
-
ハードウェア処理とソフトウェ...
-
VCで処理中ダイアログボックス...
-
文字が入力されたときに処理に...
-
シェルアイコンがイメージリス...
-
パワーポイントでは、どうすれ...
-
掃き出し法 コツ
-
VBの質問#if 0 then ってどう...
-
マルチプロセッシングとマルチ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
switch の範囲指定
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
DoEventsがやはり分からない
-
月度は何て読みますか?
-
お家デートをしててハグを長い...
-
VB.NET Excelを読み込んでDataT...
-
VBの質問#if 0 then ってどう...
-
Do~Loopした回数をカウントしたい
-
VBAでCOPYを繰り返すと、処理が...
-
メルカリのメルカードで買い物...
-
インタラクティブの反対語は?
-
Loadイベント中にほかのイベン...
-
リョウ・・・量?料?
-
vba 空のデータをSplitする時の...
-
findは動くがfindnextがマクロ...
おすすめ情報