サンプルプログラムのソースファイル
Unit1.cpp ファイル
Unit1.h ファイル
Unit2.cpp ファイル
Unit2.h ファイル
Unit1.cpp ファイル
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
#include "Unit2.h"
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE 管理のコンポーネント
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TMemo *Memo1;
TMainMenu *MainMenu1;
TMenuItem *Exit1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Exit1Click(TObject *Sender);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
private: // ユーザー宣言
RunThread* mRunThread; //スレッドクラスのデータメンバーの宣言
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.h ファイル
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//初期設定
Button2->Enabled = false; //中止ボタンを押せなくする
Button3->Enabled = false; //一時停止ボタンを押せなくする
Button4->Enabled = false; //再開ボタンを押せなくする
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//開始のボタンが押された場合
mRunThread = new RunThread(true); //スレッドを生成、同時にスレッドを実行しないかどうか
mRunThread->FreeOnTerminate = true; //スレッド処理終了後スレッドオブジェクトを開放する
mRunThread->Resume(); //スレッドを実行する
Button1->Enabled = false;
Button2->Enabled = true;
Button3->Enabled = true;
Button4->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//中止のボタンが押された場合
mRunThread->Terminate(); //スレッドを終了させる要求を出す
if(mRunThread->Suspended) //スレッドが一時停止しているかどうか
delete mRunThread; //スレッドのメモリを開放する
Button1->Enabled = true;
Button2->Enabled = false;
Button4->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//一時停止のボタンが押された場合
mRunThread->Suspend(); //スレッドが一時停止する要求を出す。
Button3->Enabled = false;
Button4->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
//再開のボタンが押された場合
mRunThread->Resume(); //スレッドを実行する
Button1->Enabled = false;
Button3->Enabled = true;
Button4->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
//ツールバーの終了が押された場合
Close(); //プログラムを終了する
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
//プログラムの終了処理
if(Button1->Enabled==false){ //スレッドを実行しているかどうか
mRunThread->Terminate(); //スレッドを終了させる要求を出す
if(mRunThread->Suspended) //スレッドが停止しているかどうか
delete mRunThread; //スレッドのメモリを開放する
}}
//---------------------------------------------------------------------------
Unit2.cpp
ファイル
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h" //スレッドを呼び出すメイン関数のヘッダを追加
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// 注意: VCL オブジェクトのメソッドとプロパティを使用するには, Synchronize
// を使ったメソッド呼び出しでなければなりません。次に例を示します。
//
// Synchronize(UpdateCaption);
//
// ここで, UpdateCaption は次のように記述できます。
//
// void __fastcall RunThread::UpdateCaption()
// {
// Form1->Caption = "スレッドから書き換えました";
// }
//---------------------------------------------------------------------------
__fastcall RunThread::RunThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall RunThread::Execute()
{
//---- スレッドのコードをここに記述 ----
Form1->Memo1->Lines->Clear(); //実行前にMemo1をクリア
i = 0; //変数iの初期化
for(i=0;i<=5000;i++){
if(Terminated) //スレッドの終了要求がなされているかどうか
break; //終了要求がなされていればスレッドを抜ける
Form1->Memo1->Lines->Add(AnsiString(i)); //Memo1にiの値を表示
}
Form1->Button1->Enabled = true;
Form1->Button2->Enabled = false;
Form1->Button3->Enabled = false;
Form1->Button4->Enabled = false;
}
//---------------------------------------------------------------------------
Unit2.h ファイル
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class RunThread : public TThread
{
private:
int i; //スレッド内の変数等の宣言
protected:
void __fastcall Execute();
public:
__fastcall RunThread(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif