お世話になります。
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も見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
ボタン2回押しを無効にしたい
JavaScript
-
C++での連続した左クリックの禁止の仕方について
C言語・C++・C#
-
【MFC】イベントの無効化について
C言語・C++・C#
-
-
4
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
5
.NET(VB)でボタンの連打を防止する方法
その他(プログラミング・Web制作)
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
8
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
-
9
DoEventsがやはり分からない
Visual Basic(VBA)
-
10
VB.NETでボタンのクリックイベントハンドラが2回実行される
Visual Basic(VBA)
-
11
VB6.0のEnabledをfalseにしてもクリックイベントが走ってしまう・・・
Visual Basic(VBA)
-
12
画面を強制的に再描画させる方法
C言語・C++・C#
-
13
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
14
コンボボックス ▼ボタンをクリックしたらイベント
PowerPoint(パワーポイント)
-
15
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
-
16
【C#】 あるイベントから別イベントを呼び出す。
その他(プログラミング・Web制作)
-
17
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
18
間違えて配置してしまったコントロールの削除
Visual Basic(VBA)
-
19
C# 画面のちらつきを解消したい
その他(プログラミング・Web制作)
-
20
エディットボックスの入力制限について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
DoEventsがやはり分からない
-
findは動くがfindnextがマクロ...
-
VBの質問#if 0 then ってどう...
-
vba 空のデータをSplitする時の...
-
Do~Loopした回数をカウントしたい
-
switch の範囲指定
-
取り消し線が入った文字を削除...
-
メルカリのメルカードで買い物...
-
エクセルVBA マクロ処理中のポ...
-
FFTの結果ついて
-
Loadイベント中にほかのイベン...
-
EXCEL VBA マクロ 実行する度に...
-
インタラクティブの反対語は?
-
JDBCでの大量データ検索でResul...
-
2重のDo~Loopは?
-
C# 画面のちらつきを解消したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
DoEventsがやはり分からない
-
switch の範囲指定
-
メルカリのメルカードで買い物...
-
【Excel】特定の文字を含むセル...
-
VBの質問#if 0 then ってどう...
-
VBAでCOPYを繰り返すと、処理が...
-
EXCEL VBA マクロ 実行する度に...
-
findは動くがfindnextがマクロ...
-
インタラクティブの反対語は?
-
UMLでの例外処理
-
リョウ・・・量?料?
-
Do~Loopした回数をカウントしたい
-
セックスレスの既婚女性は自慰...
-
月度は何て読みますか?
-
セルの値が0はクリアするマクロ
-
Loadイベント中にほかのイベン...
-
FFTの結果ついて
おすすめ情報