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 が返ります。



Windowsは米国Microsoft Corporationの登録商標です。