試作版仕様
Versionは0.1.0とするが、マイナチェンジで、0.1.99までのバージョンを許可する。
- 基本WindowGUIの設計
本計画では、WinMainもWindowProcもライブラリ側に定義するのである。更に、ユーザ入力用のダイヤログを1個用意するものとする。
- メインウインドウの姿
CWCCの基本ウインドウは、タイトルバーと、コンソールを装備した簡単なものとする。
メニュー構造は、以下の通りとする。
アイコンについては、ファイル名を固定とし、ユーザ指定の場合は、これを置き換える事で対応するものとする。
Pauseはスレッドの一時停止を行う。
Resumeはスレッドの再開を行う。
Exitは、アプリ全体の終了を行う。
About Cwccは、CWCCのバージョンを表示するものとする。
- スレッド管理
スレッドは、メインウインドウを開いた直後、速やかに起動する事。
スレッドの引数は、メインウインドウのハンドルと、コマンドラインとする事。
→コマンドラインの渡し方については別途検討
コマンドラインは、メールボックスにコピーして渡すものとする◆
スレッド状態の管理は、ThreadState変数を使用して、以下の通り行う。
ThreadState | 状態 | 備考
|
---|
0 | 停止中 | 開始のみ許容する
| 1 | 実行中 | 一時停止,終了を許容する
| 2 | 一時停止中 | 再開のみ許容する
|
- スレッド動作規定
スレッド中の動作は、以下の通り進行するものとする。
- スレッドの初期化
- CwccMainをコール
CwccMainの引数は、コマンドラインとする。
CwccMainの戻り値については、別途検討する。
CwccMainの戻り値(MailInt)により、Thread終了時に、アプリ全体を終了させるか、否かをコントロールする。(★)
0:CwccMainの終了即ちアプリの終了
1:CwccMainが終了しても、アプリは継続
- スレッドの終了要求をメイン側にポストし、長期間ループに入る。
→この期間にスレッド終了とならない場合は、自分で終了し、0を返す。
- メインウインドウとの通信機能
コンソールへの文字表示等は、メイン側でハンドルする為、通信機能は幾つか用意する必要が有る。
- メイン動作依頼
メイン側への動作依頼は、イベントを発生させる事によって、メイン側に動作を依頼するものとする。イベントは、PostMessageにて通知し、メッセージIDは、700〜を使用するものとする。
- メールボックス
メイン側への文字列メッセージの譲渡と、メインからの文字列メッセージの取得には、メールボックス(CwccMailBox[])を使用する。メールボックスの容量は、とりあえず4096文字とする。
※Printの連続実行等で、メイン側がメールボックスを読み出す前に、次の文字列がセットされる場合が有るので、メールボックスにてメッセージをやりとりする場合、Thread側は一時停止とするのが望ましい。但し、処理速度に問題が有る可能性も有るので、将来的には、改善策を考える。★
- 自己状態管理変数(ThreadStateEX)
メイン側に要求し、文字列の取得を行う様な場合、スレッドが実行を続けてしまうと取得処理が終わった時点で、取得した文字列を使用した処理は終わってしまうので、メイン側は一旦スレッドを停止させ、文字列の取得が成った時点でスレッドを再開させるのであるが、この場合、スレッド側の関数では、自分が一時停止状態となった事を知るために自己状態管理変数を使用するものとする。
この変数は、メイン側では、初期化時以外は、1のみが記入出来、スレッド側では0のみ記入出来るものとする。スレッド側は、これが1になるのを待つループを回る。1になった時点で、スレッド側はループを抜け、この変数に0をセットするものとする。
以降、この処理を、スレッド側:スレッド自己管理処理/メイン側:スレッド修復処理と呼ぶ
- 基本関数
以下の関数と動作を、以下の通り定義する。
- CwccPrint(char *String) ;
メイン側に、CWCC_IDM_PRINTのメッセージを発行し、Stringの内容をメールボックスにセットする。処理が終了するまで、スレッド自己管理処理にて待ち状態となること。★
メイン側は、このメッセージを受信した時点で、メールボックスにセットされた文字列を読み出し、コンソールに表示を追加する。終了した時点でスレッド修復処理を行う。★
※将来的には、printf()ライクな、リスト型のアーギュメントを実装する予定だが、とりあえず、試作段階ではこの関数を実装する。
- CwccGets(char *Msg,char *String) ;
メイン側に、CWCC_IDM_GETSのメッセージを発行し、文字列の取得を待つ。スレッド自己管理処理にて待ち状態である事。
メイン側では、スレッドを一時停止してから、文字列取得用のダイヤログを表示し、そのダイヤログが終了した時点でスレッド修復処理を行う。
- CwccMessage(char *String) ;
メイン側に、CWCC_IDM_MBOXのメッセージを発行し、メッセージボックスの表示を依頼する。スレッド自己管理処理にて待ち状態である事。
メイン側では、スレッドを一時停止してから、文字列取得用のダイヤログを表示し、そのダイヤログが終了した時点でスレッド修復処理を行う。
- 今後の拡張予定等
とりあえず、試作版は、CoolLibを使用せずに作成する予定であるが、今後の拡張では、使用を検討する。また、現行考えている今後の拡張予定を下記に示す。
- CwccGetchの実装
キーイベントのハンドルをする必要が有るため、試作では見送った機能であるが、可能で有ればハンドルしたい。
- グラフィック画面の実装
何も表示の無いWindowを一枚表示して、そちらにグラフィック表示を行う事を考える。
- タイマの実装
スレッド側からタイマの発行と、タイマのハンドルを実施出来る仕組みを組み込む。→タイマ・プロシージャとして、スレッド側の関数を指定すれば可能である。
- ファイルダイヤログの実装
基本的には、CwccGets()の処理と同等である。ファイル名を取得する。
- 内部構造の隠蔽
クラス化する事によって、ユーザが誤って変数等に触らない様にする仕組みが必要である。
- コンパイラ
CWCCは、結果として、CWCC.OBJとCWCC.H,CWCC.RES又はCWCC.RCという形で提供されるのであるが、単発のプログラムをコンパイルするのに、makefileを作成するのは面倒という話も有るので、CWCCというコマンドラインコンパイラ(実体はBCC32.EXEとILINK32.EXEを起動するか、MAKEFILEを自動生成してMAKEを実行する仕組み)を用意する予定。
|