前回の続きです。
「ファイル検索ツールを作ってみた – C++Builder好きの秘密基地」で公開されているファイル検索ツールのソースコードを読んで勉強します。
検索処理では、TJvThreadが使用されています。
TJvThreadはJVCLのコンポーネントです。
残念ながらまとまった資料を見つけることができませんでした。
スレッドが始まるとOnBeginイベントが発生し、OnExecuteイベントでメインの処理を行い、処理が終わるとOnFinishイベントが発生するようです。
JVCLをダウンロードしたフォルダーにexamplesフォルダーがあり、JvThreadのサンプルコードを見つけることができました。
なぜかDelphi用のサンプルコードは簡素なものなのに、BCBフォルダーにあるC++Builder用のサンプルコードは手の込んだプログラムになっていました。
Delphi用サンプルプログラム
C++Builder用サンプルプログラム
サンプルプログラムを参考に、TJvThreadについて学びたいと思います。
検索中にESCキーを押すと、検索処理を中断する仕組み。
フォームのOnKeyPressイベントでキー入力を取得し、ESCキーが押されたかどうかを判定しています。
void __fastcall TfrmMain::FormKeyPress(TObject *Sender, wchar_t &Key)
{
if (JvThread1->Count && Key == 0x1b) {
QueryCancel();
}
}
キャンセルされたときの処理。
処理をいったん中断して、確認ダイアログを表示します。
中断をキャンセルしたときは処理を再開します。
void __fastcall TfrmMain::QueryCancel()
{
JvThread1->Suspend();
int ret = MessageDlg("検索を中断しますか?", mtConfirmation, TMsgDlgButtons() << mbYes<<mbNo, 0);
if (ret == mrYes) {
JvThread1->TerminateWaitFor();
JvThread1CancelExecute(JvThread1);
} else {
JvThread1->Resume(JvThread1->LastThread);
}
}
ということで、検索処理で気になった部分を取り上げました。
次回に続きます。
Pingback: ファイル検索ツールのソースコードを読んで勉強する(1) « 山本隆の開発日誌
Pingback: ファイル検索ツールのソースコードを読んで勉強する(3) « 山本隆の開発日誌