Visual C++でWin32アプリケーションを作成しています。
作成環境:
Windows Vista 64bit (iMac bootcamp)
Microsoft Visual C++ 2010 Express
フォーム上にbutton1とbutton2がセッティングされている状態で、
button1_Clickの処理を行っている間に、button2が押されたとします。
その作用として、button1_Click内部の変数を変更したいと考えています。
この処理は可能でしょうか。
または、代替処理として、何らかの形で干渉する事は出来ますでしょうか。
No.3ベストアンサー
- 回答日時:
>ただ、よりシンプルに記述する方法はないのでしょうか。
#2 のプログラムは、質問に
>button1_Click内部の変数を変更したいと考えています。
と書かれていたので、無理やりこのような形にしただけのことです。
#2 のプログラムを private 変数を使用する方法にすると次のようになります。
private:
bool loopFlag;
System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
loopFlag = false;
}
// 開始
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
if( !loopFlag ) {
loopFlag = true;
while( loopFlag ) {
Application::DoEvents();
this->label1->Text = DateTime::Now.ToString();
}
this->label1->Text = "";
}
}
// 停止
System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
loopFlag = false;
}
System::Void Form1_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {
loopFlag = false;
}
マルチスレッドについては
.NETマルチスレッド・プログラミング入門
第2回 .NETにおけるマルチスレッドの実装方法を総括
http://www.atmarkit.co.jp/fdotnet/mthread/mthrea …
Windowsフォームで別スレッドからコントロールを操作するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/312 …
などを参考にされると良いと思います。
No.2
- 回答日時:
C++/CLI ということですね?
button1_Click の中で Application.DoEvents() を実行してやれば、多少動作はぎこちなくなると思いますが、button1_Click の処理中に button2 をクリックすることが可能となります。
static 変数にすれば、無理やり感はありますが、button2_Click から button1_Click を呼び出して static 変数を変更することは可能です。
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
static bool loopFlag = false;
if( ((Button^)sender)->Name == "button1" ) {
if( !loopFlag ) {
loopFlag = true;
while( loopFlag ) {
Application::DoEvents();
this->label1->Text = DateTime::Now.ToString();
}
this->label1->Text = "";
}
} else {
loopFlag = false;
}
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
button1_Click(sender, e );
}
private: System::Void Form1_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {
this->button2->PerformClick();
}
ただ、static 変数にせず、private などで宣言するのが一般的なやり方ではないかと思います。
( Application.DoEvents() も使用せず、別スレッドを作成する方がよいような気がします。)
この回答への補足
ご回答ありがとうございます。解りやすいコードでやり方を理解できました。
Application::DoEventsがミソになるんですね。
ただ、よりシンプルに記述する方法はないのでしょうか。
例えば、button1が再生ボタンで、そこに中断ボタン(button2)があったり、
ボリューム調整ボタン(trackBar1)があったりして、
button1_Click中に、複数のイベントが発生する場合があると思います。
別スレッドの作成についてももう少し詳しい説明をいただければ幸いです。
No.1
- 回答日時:
>button1_Clickの処理を行っている間に、button2が押されたとします。
>その作用として、button1_Click内部の変数を変更したいと考えています。
button1_Click()の処理が終わるまで、button2の操作に対する処理(button2_Click())は実行できません。
仮にbutton2_Click()が処理できても「button1_Click内部の変数」はスコープ外でしょうから無理かと。
# 静的変数にしていない限り、寿命は処理が終わるまで…ですしね。
button1_Click()内で、自前でメッセージ処理すれば可能かも知れませんが…いろいろ面倒かと思われます。
「メッセージポンプ」とか「PeekMessage」で検索すると見つかるかと。
MFC固有の処理が実行されるか…はどうなんでしょうかね。
まぁ、現実的にbutton1_Click()で時間のかかる処理でもしていない限り、button2を押すのは無理でしょう。
また、時間のかかる処理をしているならワーカースレッド起こしてそちらで処理するべきです。
同期処理が手間になりますが。(button1が連打されるとか)
ワーカースレッドなしで時間のかかる処理をしていると…OSから「(応答なし)」のラベルを貰えるかも知れません。
# button1を押した後、ウィンドウの移動してみるとかAlt+TAB等でアクティブを切り替えるとか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- その他(プログラミング・Web制作) python fbprophetについて 1 2022/09/29 19:44
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Visual Basic(VBA) フレームワーク「4.8.1」で、[Sub Main]が動かない。助けて下さい 3 2022/11/14 15:40
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
- HTML・CSS htmlで画面遷移させたい 1 2022/10/28 18:19
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel(VBA)シート上のコマンド...
-
メッセージボックスのボタン名変更
-
C#で処理中画面を表示したい。
-
スロットゲームのプログラミング
-
エクセルVBAでクリップボード内...
-
VBSの処理中一旦処理を止めて再...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
マイコンからプログラムを読み...
-
DoEvents関数って何?
-
forkについて
-
誤ってプロセスの終了をしてし...
-
WindowsAPIのCreateFile関数ま...
-
4分木の探索プログラミングにつ...
-
C言語primeについて
-
C言語における再帰呼び出しの...
-
ExcelのVBAでX=0〜1の定積分を...
-
【C言語】再帰が時間がかかる...
-
MACで動く実行ファイルをWindow...
-
VBSでのPostMessageについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
【C#】 あるイベントから別イ...
-
Excel VBA で処理中断(DoEvents...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
Excel VBA 自動的に閉じるMsgBox
-
ASP.NETでのメッセージ画面を出...
-
メッセージBOXの「はい」「いい...
-
「キャンセル」ボタン付きの処...
-
B列に特定の文字列が入っている...
-
シャットダウン時のExcel強制終...
-
ASP VBScriptでスクリプト実行...
-
起動後直に実行するコードはど...
-
MFCのメニューバーのイベント取得
-
アクセスでのキー送信について
おすすめ情報