HimaJyun最近、ようやくWindowsプログラミングを始めました。今回はJavaの時の様にいきなり無茶をしない様に気を付けています。(始めてのJavaでいきなりMySQLを操作しようとしました、なんとか出来ました)ウインドウ(フォーム)は中でループがぐ~るぐるなので止めちゃ行けないから、重たい処理やループでぐ~るぐるする物(イベントの監視とか)はサブスレッドにするらしいです。他のスレッドのフォームを操作すると怒られちゃうので、BeginInvokeとデリゲートなるモノを用いて操作するのですが、それがググっても少しパッとしなかったのでメモも兼ねて記事にします。サンプルウインドウは止められない!!ご存知の方が大半だと思うのですが、念のために説明しておくと、Windowsでのウインドウ(フォーム)はイベント駆動と呼ばれる手法で行っています。簡単に説明すると、フォームが呼び出されると、内部でぐ~るぐるとループが回ってイベントの通知(ボタンがクリックされた、など)を待っており、イベントの通知があればそのイベントをキューに入れ、キューから関数を呼び出しています。フォーム内で時間の掛かる処理を行ってしまうと、ボタンのクリックなどのイベントが応答できなくなり、いわゆる「応答なし」になる、と言う訳です。(一般的に、0.1秒以上掛かるとアプリケーションの停止をユーザが認識出来るらしい)サブスレッドと言う訳で、ほぼ例外なく、その「時間のかかる処理」はサブスレッドに切り分けて行う事になるのですが、殆どの場合は「処理開始、終わり、完了!!」とはならないはずです。「処理を開始します」、「処理を実行しています」、「処理が完了しました」、「処理の結果です」......と言った具合に、処理が実行されている事、完了した事をユーザに通知してやらねばなりません。言う訳で、通知してあげましょう「textBox1->AppendText("処理が完了しました!!");」とかやっちゃうと以下の様なエラーが出ます。フォームの操作はスレッドセーフでは無いため、この様なエラーが発生します。そこで登場するのがBeginInvokeとデリゲートです。サブスレッドから操作サブスレッドからフォーム上の要素を操作するためには「BeginInvoke」と言う物を使用します。この、「BeginInvoke」は、最初の方で説明したイベントの通知が入る「キュー」に「この関数を呼び出してください」と言う命令を突っ込みます。メインスレッドはループでぐ~るぐると回りながらキューを取り出していくため、「この関数を呼び出してください」と言う命令が取り出されて実行されます。関数を呼び出す命令が「メインスレッド」で実行されるのです。言い換えれば、サブスレッドからフォームを安全に操作しているのではなく、「メインスレッドにフォームの操作を行う関数の実行を依頼」しているのです。呼び出される関数自体はメインスレッドで実行されているため、ここでSleep(9999);とかやったら当然ながらフリーズします。実際にやってみると言っても、そう難しい物ではありません。簡単なサンプルが以下の通りです。textBox1-&gt;AppendText(str);}これで分かる人は殆ど居ないと思うので解説するとまず最初に、以下の様にしてフォームの要素を操作する関数と、デリゲートを定義します。textBox1-&gt;AppendText(str);}次に、サブスレッド側からBeginInvokeの引数としてデリゲートを渡す、と言う訳です。&amp;クラス名::execDele),&quot;処理が完了しました!!&quot;);基本的にこれだけなのでこれ以上の解説が逆に難しいのですが、この様にすることでサブスレッドからフォームの要素を操作する事が出来ます。サンプル「解説が意味わかんねぇよクソッタレ」と言う方のために、実際の利用例を用意しました、参考にしてみて下さい。Communityでの動作を確認しました。ここを変更すると進捗状況バーの速度が変わります。使用中のリソースをすべてクリーンアップします。必要なデザイナー変数です。サポートに必要なメソッドです。エディターで変更しないでください。_DEBUGが効かない時はランタイムライブラリを疑え最近はDirectXに手出しして(、Minecraftサーバは放置して)いる、D......続きを読む→[VC++]exeに内包したリソースを読み込むもはや驚く事でもなかろうかと思われますが、exe(PE)ファイルにはデータを内包......続きを読む→VisualStudio用のMinecraftモッディング拡張機能をインストールした、そして消した。MicrosoftがMinecraftの乗っ取りに本腰を入れてきました(?)......続きを読む→PREV[Minecraft]チャットを抽出して表示する小物ツール作ったNEXT[Bukkit/Spigot]コマンドだけでDynmapからCaveを消すナカのヒト:HimaJyun​散って美しいのは桜だけです、情報はまとまっていた方が美しいのです。