Windows版iTRONサービスコールの作成 (タスク管理)
(その5)
タスクを終了させるサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
ext_tsk | 呼び出したタスクを終了します。 |
exd_tsk | 呼び出したタスクを終了して削除します。 |
ter_tsk | 指定したタスクを強制終了します。 |
呼び出したタスクを終了させるサービスコールは以下のとおりです。
void ext_tsk( void )
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 自タスクの終了.
*
* @param なし.
*
* @retval なし.
*/
void ext_tsk( void )
{
//! タスクを終了させる.
wi_ExitTask();
}
・タスクの終了関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief 自タスクの終了.
*
* @param なし.
*
* @retval なし.
*/
void wi_ExitTask( void )
{
WITSKOBJ *p;
wi_CommonLock();
//! 自タスクのタスク・オブジェクトを取得する.
p = wi_GetTaskObject( TSK_SELF );
if( p ){
p->TaskState = TTS_DMT;
}
wi_CommonUnlock();
_endthreadex( 0 );
}
タスクの終了関数は以下のような処理を行います。
- 自タスクのタスク・オブジェクトを取り出して、タスクの実行状態をを『TTS_DMT(休止中)』にします。
- スレッドの終了関数 _endthreadex() を呼び出します。
_beginthreadex()で生成したWindowsのスレッドを終了させるには _endthreadex() を呼び出します。
void _endthreadex( unsigned retval )
引数 | 説明 |
---|---|
retval | スレッド終了コード。 |
_endthreadex()からは戻ってきません。
_endthreadex() を呼び出してもスレッド・ハンドルはクローズされませんので、del_tsk() で CloseHandle()を呼び出してスレッド・ハンドルをクローズするようにします。
呼び出したタスクを終了させ削除するサービスコールは以下のとおりです。
void exd_tsk( void )
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 自タスクの終了と削除.
*
* @param なし.
*
* @retval なし.
*/
void exd_tsk( void )
{
//! タスクを終了させてコンテキストを削除する.
wi_ExpendTask();
}
・タスクの終了&削除関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief 自タスクの終了と削除.
*
* @param なし.
*
* @retval なし.
*/
void wi_ExpendTask( void )
{
WITSKOBJ *p;
wi_CommonLock();
//! 自タスクのタスク・オブジェクトを取得する.
p = wi_GetTaskObject( TSK_SELF );
if( p ){
p->TaskState = TTS_DMT;
p->Hdr.Id = -1;
//! 削除マークの付いたタスクをシステム管理タスク経由で削除する.
wi_DeleteTaskReq( p->Hdr.Id );
}
wi_CommonUnlock();
_endthreadex( 0 );
}
タスクの終了&削除関数は以下のような処理を行います。
- 自タスクのタスク・オブジェクトを取り出して、タスクの実行状態をを『TTS_DMT(休止中)』にします。
- システム管理タスクにタスクの削除を依頼する。
- スレッドの終了関数 _endthreadex() を呼び出します。
タスクを強制終了させるサービスコールは以下のとおりです。
ER ter_tsk( ID tskid )
引数 | 説明 |
---|---|
tskid | 終了させるタスクのタスクID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のタスクID番号。 |
E_NOEXS | 指定したタスクID番号のタスクが未登録。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief タスクの強制終了.
*
* @param [in] tskid タスクID番号.
*
* @retval エラーコード.
*/
ER ter_tsk( ID tskid )
{
ER ercd;
wi_CommonLock();
//! タスクを強制終了する.
ercd = wi_TermTask( tskid );
wi_CommonUnlock();
return ercd;
}
・タスクの強制終了関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief タスクの強制終了.
*
* @param [in] id タスクID番号.
*
* @retval エラーコード.
*/
ER wi_TermTask( INT id )
{
ER ercd;
WITSKOBJ *p;
//! タスクIDのオブジェクトを取得する.
p = FindTaskObject( id, &ercd );
if( !p ){
return ercd;
}
//! スレッドを強制終了する.
if( p->hThread ){
TerminateThread( p->hThread, 0 );
}
return E_OK;
}
タスクの強制終了関数は以下のような処理を行います。
- 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
- タスク・オブジェクトに対応したスレッドを TerminateThread() 呼び出して強制終了します。
スレッドを強制終了するには TerminateThread() を呼び出します。
BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )
引数 | 説明 |
---|---|
hThread | スレッドのハンドル。 |
dwExitCode | スレッドの終了コード。 |
呼び出しに成功すると TRUE、関数が失敗すると FALSE が返ります。