DATE : 2006/12/30 (Sat)
(前回の記事)
AEE シェルによるコールバック
AEE の待機中操作キューに関数を登録します。登録した順に関数がひとつずつ実行されていきます。時間のかかる処理を細切れにするには、AEE シェルに処理を細かく分けた関数を登録していくことになります。
コールバックを定義するには、AEECallback 構造体を使用します。メンバをひとつずつ設定していくこともできますが、CALLBACK_Init 関数を使うと簡単にメンバを設定できます。
例えば、callback(AEECallback* 型)に execute 関数(PFNNOTIFY 型)を登録し、その引数として data(void* 型)を渡すコードは次のようになります。
CALLBACK_Init(callback, execute, data); callback->pfnCancel = NULL;
ここで、AEECallback の pfnCancel メンバを NULL に設定している部分に注意してください。pfnCancel メンバはコールバックのキャンセル時に呼ばれる関数ポインタを格納する変数で、AEE シェルが設定します。そのため、コールバックが待機中操作キューに登録されているかどうかを確かめる BREW API の処理は、pfnCancel メンバが NULL 以外の場合に待機中操作キューに登録されていると見なします。
なお execute 関数は、void 型のポインタを引数に1つとる void 型の関数でなければなりません。
void execute(void* data) { ... }
ここで、AEECallback 型のデータと、呼び出す関数に渡すデータは、登録を行う関数が終了した後でも残っていなければなりません。ローカル変数として確保すると、関数の終了時に消えてしまいます。そこで、アプレット構造体に置く、もしくはヒープに確保するといった方法をとります。
コールバックを AEE シェルに登録するには、ISHELL_Resume 関数を使用します。以下は、callback(AEECallback* 型)を登録するコードです。ここで、m_pIShell は IShell* 型を表します。
ISHELL_Resume(m_pIShell, callback);
コールバックをキャンセルするには、pfnCancel メンバの指す関数を実行します。ただし、CALLBACK_Cancel 関数を使うと簡単です。待機中操作キューにコールバックが登録されている場合のみ、pfnCancel メンバの指す関数を実行します(ただし、待機中操作キューに登録されているか否かは、コールバックの pfnCancel メンバが NULL でないかどうかで判断しています)。
CALLBACK_Cancel(callback);
(つづきます)