昨日に続き、プログレスバーをマルチスレッドを用いて実装してみましょう。作成の目的は、スレッド実行中はモーダルダイアログを表示させること。モーダルダイアログではプログレスバーを表示し進捗が分かること。実行中のスレッドはダイアログのメンバーにアクセスできること。スレッド処理が完了次第、モーダルダイアログを閉じること。昨日までで関数宣言などは完了したので、各関数の定義・実装を進めていきます。まとめ{プロジェクト名}Dlg.cppまずはメインダイアログであるDIALOG1のソースコードを編集していきます。nCount;を宣言していました。静的変数なので実装が必要です。{プロジェクト名}Dlg.cppファイルの適当な場所に以下の実装を記述します。0;クラス名は適宜読み替えてくださいね。次に前回、メインダイアログ(DIALOG1)に追加したボタンのイベントハンドラ、OnBnClickedButton1()の実装を行いましょう。機能としてはボタンを押下されたらスレッドを開始し、プログレスバーが表示されるダイアログを表示します。スレッドの完了後呼ばれる}AfxBeginThread()関数がスレッドを開始する関数になります。MSDN第6引数まである関数ですが、第3~第6まではデフォルト引数が指定されているので、2つの引数を渡します。*型なのでポインタであれば何でも渡すことができます。今回は制御関数の中でメインダイアログクラスのメンバー関数を呼び出すため、自分自身を引数として渡しています。6行目はダイアログのクラスを宣言し、DoModal()関数を呼び出すことでプログレスバー付きのダイアログ(DIALOG2)を表示させています。メインダイアログの処理はDIALOG2に移りましたので、DIALOG2のウィンドウを閉じるまではここで処理が止まります。スレッドの処理が完了次第、DIALOG2は終了するように実装するため、処理が戻る8行目に完了を通知するメッセージボックスを表示します。pParam)AfxBeginThread()関数から呼び出される、ワーカースレッドの制御関数は以下のように実装します。AfxBeginThread()の第二引数から受け取ったpParamを適切な型にキャストします。ワーカースレッドで実際に実行される関数を呼び出します。AfxBeginThread()の第二引数から受け取ったpParamを適切な型にキャストします。ワーカースレッドで実際に実行される関数を呼び出します。*型を正しい型(今回はダイアログクラスでした)に変換します。MSDNまず、reinterpret_castでポインタ型の変換、dynamic_castで正しいオブジェクトへと変換します。変換が完了できれば、実際に別スレッドで実行される関数を呼び出します。基本的には重たい処理やユーザーを待たせたい処理の実行関数になるでしょうか。ThreadProc()この実処理を行う関数は人によってそれぞれ異なるのでどんな内容でも構わないのですが、以下のようにしました。{Sleep(100);}}}メンバー変数である、nCount(今回は静的変数ですがメンバー変数であってもアクセス可能です)をインクリメントし、100回に一度、100ミリ秒のスリープを実行します。nCountが10,000,000に到達した時点でループから抜けて処理が終了、スレッドもほぼ同時に終了となります。ここまででメインのダイアログの記述は終了です。長くなってしまったのでプログレスバーが表示されるダイアログクラスの実装は明日行いましょう。まとめスレッドが目にも止まらぬ速度で終わってはスレッドの進行が分からないので無意味なスリープなどを挿入していますが、実際にはファイルの書き出しやローディングなどが実行されることになるでしょうか。クラスの設計をしっかり行っていればメインのダイアログで処理に必要な変数はできる限り少なくしておくべきですがコントロール変数などを持っているダイアログのメンバーにアクセスできるため、利用しやすいですよね。【Boost】Boostライブラリの日付を使ってみよう!先日の記事でBoostをインストールできたのでBoostのライブラリを使って遊んでみましょう。インストールを行ったOpenCVライブラリを使ってサンプルプログラムをいくつか作成してみましょう。C++】エクスプローラーのディレクトリー構成などツリーコントロールの活用場面は多いです。NeonとCDT/MinGWでC++開発環境を作成しよう!(2)前回の記事でEclipseにCDTを追加インストールすることができました。今回はMinGWとMSYSをインストールし、Eclipse上でC++プロジェクトを実行してみましょう。...C++でインターフェイスを作成しよう。私事ですが今後業務ではC++を使用することになりそうです。