仲野 雅都 鏡原 聡
2002/7/22
スレッド入門
最初に
ファイル(F)‐新規作成(N)…から[新規作成]の’スレッドオブジェクト’を選択。
“スレッドオブジェクトの作成”のクラス名(C):に適当な名前を付ける。(注1)
注1:メイン関数からスレッドを呼び出す際にこの名前を使用する。本書での便宜上名前はRunThread とする。
名前の入力が終わればO.Kをクリックする。
CPPファイルが作成されるのでそこにスレッドで処理したいプログラムを入力します。
(作成されたファイルが表示されています。)
スレッドを使用するには?
スレッドを使用するフォームのヘッダーファイルの名前をすべて、今作成したスレッドのCPPファイルに入力してください。
(ヘッダーファイルはCPPファイルを右クリック後”ソース/ヘッダーファイルを開く(H) Ctrl+F6”を選択して表示させるか、CPPファイルのフォーム上でCtrlキーとF6の同時押しで表示させることができます。)
(例)使用するフォームがUnit1.cppで構成されていて、スレッドがUnit2.cppであるとすると、Unit2.cppの上方に#include…と入力されている場所に#include “Unit1.h” と入力し、Unit1.cppからヘッダーファイルUnit1.hを呼び出し同様に#include “Unit2.h” を入力する。
これで、Unit1とUnit2でデータの共有ができるようになります。
スレッド使用するフォームのヘッダーファイル(ここではUnit1.h)の”private: // ユーザー宣言”の欄に最初にクラスの宣言をした名前(本書では RunThread )に*を付け、その後一文字開けて名前の前にmを付けたものを入力し最後に“;”の記号で閉じる。(名前* m名前;)のような形になる。本書の場合はRunThread* mRunThread; となる。
これで、Unit1でスレッドを使う事ができるようになります。
スレッドの使い方(プログラムを一時停止&中断させる。)
Unit2.cpp(スレッドで作成されたCPPファイル)の// TODO : スレッドとして実行したいコードをここに記述 */の欄に実行させたいプログラムを入力する。
ここで、Form1にあるButtonなどを利用する場合は、Form1->Buttonというように記述する。詳しい理由は入門編では省く。ボタンのそのプログラムのループ部分(for文やdo-while文 etc)にif(Terminated) break;を挿入する。
これは、スレッドの終了要求(スレッド文を中止する)があれば中断できるようにする。
入力したプログラムは次のコマンドを実行するフォーム(Unit1.cpp)の実行ボタン等に入力する。
@ mRunThread = new RunThread(true); //スレッドを生成、同時にスレッドを実行しないかどうか
A mRunThread->FreeOnTerminate = true; //スレッド処理終了後スレッドオブジェクトを開放する
B mRunThread->Resume(); //スレッドを実行する。
@〜Bはスレッドを呼び出し実行する。
CmRunThread->Terminate(); //スレッドを終了させる要求を出す
Dif(mRunThread->Suspended){ //スレッドが一時停止されているかどうか
Edelete mRunThread;} //スレッドオブジェクトの開放
C〜Eは実行したスレッドを中止させる。
FmRunThread->Suspend(); //スレッドを一時停止させる。
スレッドに一時停止処理を1回送る。
(この処理は複数回送ることが可能なので複数回おくるとそれを解除するGの処理もそれと同回数する必要がでてくる。
GmRunThread->Resume(); //スレッドの一時停止を解除する。
スレッドの一時停止処理を1回分解除する。
Fの処理やGの処理は実際のプログラムでは、一時停止や解除は1回行えればよいのでトラップ処理(サンプルプログラム参照)等で複数回の実行を回避すればよい。
@〜B、C〜E、F、Gをそれぞれボタンのキャップションを”実行”、”中止”、”一時停止”、”再開”などにしてフォームに配置する。
以上で実行、一時停止、再開、中止を行える簡単なプログラミングは終了です。