Windows版iTRONサービスコールの作成 (タスク管理)
(その6)

タスク優先度の設定と参照

タスク優先度の設定と参照を行うサービスコールは以下のとおりです。


サービスコール名説明
chg_pri

タスク優先度を設定します。

get_pri

タスク優先度を参照します。

※ get_pri()はVer4.0のみサポートされます。

タスク優先度を設定する

タスク優先度を設定するには以下のサービスコールを使用します。

※ Ver3.0、Ver4.0共に同じサービスコールの形式です。



    ER chg_pri( ID tskid, PRI tskpri )
	

引数説明
tskid

タスクID番号。

tskpri

設定するタスク優先度。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のタスクID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したタスクID番号は登録済み。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  タスク優先度の変更.
 *
 *  @param  [in]    tskid   タスクID番号.
 *  @param  [in]    tskpri  タスク優先度.
 *
 *  @retval エラーコード.
 */
ER      chg_pri( ID tskid, PRI tskpri )
{
    ER ercd;

    wi_CommonLock();

    //! タスクの優先度を変更する.
    ercd = wi_ChangeTaskPriority( tskid, tskpri );

    wi_CommonUnlock();
    return ercd;
}
	


・タスク優先度を設定する関数のソースコードは以下のとおりです。


/****************************************************************************/
/*!
 *  @brief  タスク優先度の変更.
 *
 *  @param  [in]    id          タスクID番号.
 *  @param  [in]    priority    タスク優先度.
 *
 *  @retval エラーコード.
 */
ER      wi_ChangeTaskPriority( INT id, PRI priority )
{
    int         curpri,newpri;
    ER          ercd;
    WITSKOBJ    *p;

    //! タスクIDのオブジェクトを取得する.
    p = FindTaskObject( id, &ercd );
    if( !p ){
        return ercd;
    }
    if( !p->hThread ){
        return E_OBJ;
    }
    //! 不正なタスク優先度の場合はエラーにする.
    if( priority == 0 ){
        return E_PAR;
    }
    p->TaskPri = priority;

    //! 現在のスレッドの相対優先順位値を取得する.
    curpri = GetThreadPriority( p->hThread );

    //! 変更するタスク優先度をスレッドの相対優先順位値に変換する.
    newpri = ConvertPriority( priority );

    //! スレッドの相対優先順位値が変更される場合、スレッドのプライオリティを変更する.
    if( curpri != newpri ){
        SetThreadPriority( p->hThread, newpri );
    }
    return E_OK;
}
	

タスク優先度を設定する関数は以下のような処理を行います。

  • 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
  • 引数のタスク優先度が 0 の場合はエラー終了にする。
  • GetThreadPriority() を呼び出して、現在のスレッドの相対優先順位を取得します。
  • 変更するタスク優先度をスレッドの相対優先順位値に変換します。
  • SetThreadPriority() を呼び出して、現在のスレッドの相対優先順位を設定します。

スレッドの優先度を取得するのは GetThreadPriority() を呼び出します。


	int GetThreadPriority( HANDLE hThread )
	

引数説明
hThread

スレッドのハンドル。

呼び出しに成功すると指定したスレッドの相対優先順位値が返ります。

呼び出しに失敗すると THREAD_PRIORITY_ERROR_RETURN が返ります。


・タスク優先度をスレッドの相対優先順位値に変換する関数のソースコードは以下のとおりです。


/****************************************************************************/
/*!
 *  @brief  タスク優先度をWindowsスレッドの相対優先順位値に変更する.
 *
 *  @param  [in]    tskpri  タスク優先度.
 *
 *  @retval スレッドの相対優先順位値.
 */
static int      ConvertPriority( PRI tskpri )
{
    if( tskpri < 10 ){
        return THREAD_PRIORITY_ABOVE_NORMAL;
    }else
    if( tskpri < 50 ){
        return THREAD_PRIORITY_NORMAL;
    }else
    if( tskpri < 100 ){
        return THREAD_PRIORITY_BELOW_NORMAL;
    }
    return THREAD_PRIORITY_LOWEST;
}
	

※とりあえず4段階にタスク優先度を変換してあります。特に意味はないので、ご自分に都合のよいように直してお使いください。

タスク優先度を参照する (Ver4.0のみ)

タスク優先度を参照するには以下のサービスコールを使用します。



    ER get_pri( ID tskid, PRI *p_tskpri )
	

引数説明
tskid

タスクID番号。

p_tskpri

現在のタスク優先度を格納する領域のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のタスクID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したタスクID番号は登録済み。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  タスク優先度の参照.
 *
 *  @param  [in]    tskid       タスクID番号.
 *  @param  [out]   p_tskpri    現在のタスク優先度を格納する領域のポインタ.
 *
 *  @retval エラーコード.
 */
ER      get_pri( ID tskid, PRI *p_tskpri )
{
    ER ercd;

    wi_CommonLock();

    //! タスクの優先度を取得する.
    ercd = wi_RefarenceTaskPriority( tskid, p_tskpri );

    wi_CommonUnlock();
    return ercd;
}
	

・タスク優先度を参照する関数のソースコードは以下のとおりです。


/****************************************************************************/
/*!
 *  @brief  タスク優先度の参照.
 *
 *  @param  [in]    id          タスクID番号.
 *  @param  [in]    priority    現在のタスク優先度を格納する領域のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceTaskPriority( INT id, PRI *priority )
{
    ER          ercd;
    WITSKOBJ    *p;

    //! タスクIDのオブジェクトを取得する.
    p = FindTaskObject( id, &ercd );
    if( !p ){
        return ercd;
    }
    //! 引数が不正な場合はエラーにする.
    if( !priority ){
        return E_PAR;
    }
    //! タスクの優先度を戻り値にセットする.
    *priority = p->TaskPri;

    return E_OK;
}
	

タスク優先度を参照する関数は以下のような処理を行います。

  • 引数で指定されたタスクID番号に該当するタスク・オブジェクトを取り出します。
  • 引数のタスク優先度を格納する領域のポインタが NULL の場合はエラー終了にする。
  • 引数のタスク優先度を格納する領域に現在のタスク優先度をセットして終了します。


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