Windows版iTRONサービスコールの作成 (タスク管理)
(その11)
タスクをサスペンド(強制待ち状態に移行)するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
sus_tsk | タスクを強制待ち状態にします。 |
※ Ver3.0、Ver4.0共に同じサービスコールの形式です。
タスクを強制待ち状態にするには以下のサービスコールを使用します。
ER sus_tsk( ID tskid )
引数 | 説明 |
---|---|
tskid | タスクID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_NOEXS | 指定したタスクID番号のタスクが未登録。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 強制待ち状態への移行.
*
* @param [in] tskid タスクID番号.
*
* @retval エラーコード.
*/
ER sus_tsk( ID tskid )
{
ER ercd;
wi_CommonLock();
//! タスクを中断(強制待ち状態)にする.
ercd = wi_SuspendTask( tskid );
wi_CommonUnlock();
return ercd;
}
タスクID番号を引数にしてタスクのサスペンド関数を呼び出します。
タスクのサスペンド関数
タスクをサスペンドする関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief 強制待ち状態への移行.
*
* @param [in] id タスクID番号.
*
* @retval エラーコード.
*/
ER wi_SuspendTask( INT id )
{
DWORD cnt;
ER ercd;
WITSKOBJ *p;
//! タスクIDのオブジェクトを取得する.
p = FindTaskObject( id, &ercd );
if( !p ){
return ercd;
}
if( !p->hThread ){
return E_OBJ;
}
//! スレッドの実行を中断する.
cnt = SuspendThread( p->hThread );
if( cnt == -1 ){
return E_SYS;
}
p->TaskState = TTS_SUS;
//! スレッドの中断カウンタを+1する.
p->SuspendCnt = cnt + 1;
return E_OK;
}
タスクをサスペンドする関数は以下のような処理を行います。
- 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
- スレッドの実行を中断します。
- SuspendThread()の戻り値が -1の場合はエラー終了にします。
- スレッドの中断カウンタを +1 して処理を終了します。
スレッドの実行を中断するには SuspendThread() を呼び出します。
DWORD SuspendThread( HANDLE hThread )
引数 | 説明 |
---|---|
hThread | スレッドのハンドル。 |
呼び出しに成功すると、関数を呼び出す前のサスペンド受付数が返ります。
関数が失敗すると、-1 が返ります。