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



商標に関する表示