pit-rayの備忘録

開発中に得た知識を記事にしていくブログ

タスクシステムライブラリ tasksyslib リファレンス

C/C++対象のタスクシステムライブラリtasksyslibのリファレンスです。
GitHubでダウンロードする
規約等をみる


1・InitTaskSys関数:タスクシステムの初期化

宣言

TaskSystem* InitTaskSys(
    unsigned int max_task_num
) ;

概略
タスクシステムを初期化する

引数
max_task_num : タスクシステムに登録できる任意の最大タスク数

戻り値
メモリアドレス : 成功
NULL      : 失敗

解説
タスクシステムの規模を引数により設定し、タスクシステムを構築します。
TaskSystemポインタ型のオブジェクトにこの関数を代入して呼び出します。

実装例を見る
目次に戻る

2・RegisterNewTask関数:タスクの登録

宣言

Task* RegisterNewTask(
    TaskSystem *p_task_sys
) ;

概略
タスクシステムにタスクを登録する

引数
p_task_sys : 登録するタスクシステムのポインタ

戻り値
メモリアドレス : 成功
NULL      : 失敗

解説
タスクはデフォルトでは非アクティブ状態で登録されています。
IsActivateRegdTask関数で有効化することができます。
Taskポインタ型のオブジェクトにこの関数を代入して呼び出します。

実装例を見る
目次に戻る

3・SetTaskParameter関数:タスクの設定

宣言  

void SetTaskParameter(
    Task* p_task,
    unsigned int priority,
    void ( *p_FuncAccessed ) ( Task* ),
    void* p_resource
) ;

概略
タスク自体の設定をする

引数
p_task     : 設定対象のタスクのポインタ
priority     : タスクの優先度
p_FuncAccessed : タスクが呼び出す関数のポインタ
p_resource   : タスクに渡すデータへのポインタ

戻り値
なし

解説
第一引数は、RegisterNewTask関数で登録済みのタスクを用いる。
第二引数は、unsigned intで扱える値(0 ~ 4,294,967,295)ならばなんでもよい。自由に決めてもらって構わない。
第三引数は、通常、関数自体は普通に定義して&を付けて関数を引数として渡す。関数はvoid型で引数がTask*型でなければならない。
第四引数は、関数が外部のデータとやりとりするためのvoidポインタ。データを取り出すときには一度キャストしたほうが良い

実装例を見る
目次に戻る

4・IsActivateRegdTask関数:タスクを有効化

宣言

bool IsActivateRegdTask(
    TaskSystem* p_task_sys,
    Task*       p_regd_task
) ;

概略
タスクシステムに登録済みのタスクをアクティブにする

引数
p_task_sys : 登録しているタスクシステムのポインタ
p_task_sys : アクティブにしたいタスクのポインタ

戻り値
true : 成功
false : 失敗

解説
アクティブなタスクは処理対象になる。
注意すべき点としては必ず、登録後のタスクを用いること。

実装例を見る
目次に戻る

5・IsDeactivateRegdTask関数:タスクを無効化

宣言

bool IsDeactivateRegdTask(
    TaskSystem* p_task_sys,
    Task*       p_regd_task
) ;

概略
タスクシステムに登録済みのタスクを非アクティブにする

引数
p_task_sys : 登録しているタスクシステムのポインタ
p_regd_task : 非アクティブにしたいタスクのポインタ

戻り値
true : 成功
false : 失敗

解説
非アクティブにしてもタスクシステムからは削除されない。
あくまで処理対象から外れるだけ。
IsActivateRegdTask関数と同様に登録済みのタスクを用いる。

実装例を見る
目次に戻る

6・IsDelTask関数:タスクを削除

宣言

bool IsDelTask(
    TaskSystem* p_task_sys,
    Task*       p_regd_task
)

概略
タスクシステム上からタスクを完全削除する

引数
p_task_sys : 登録するタスクシステムのポインタ
p_regd_task : 削除したいタスクのポインタ

戻り値
true : 成功
false : 失敗

解説
RegisterNewTask関数と対になる処理である。
タスクの削除を行うと、同時に非アクティブ化も行われるので処理対象から外れる。

実装例を見る
目次に戻る

7・IsDelAllInactiveTask関数:無効タスクを削除

宣言

bool IsDelAllInactiveTask(
    TaskSystem* p_task_sys,
    Task*       p_regd_task
)

概略
タスクシステム上から非アクティブタスクのみ完全削除する

引数
p_task_sys : 登録するタスクシステムのポインタ

戻り値
true : 成功
false : 失敗

解説
全ての非アクティブタスクに対して削除処理が行われる。

実装例を見る
目次に戻る

8・IsCallActiveFunc関数:タスクの実行

宣言

bool IsCallActiveFunc(
    TaskSystem* p_task_sys
)

概略
アクティブタスクの処理関数を優先度にしたがって呼び出す

引数
p_task_sys : 対象のタスクシステム

戻り値
true : 成功
false : 失敗

解説
タスクに付けた優先度に従って処理関数を呼び出す。
同じ優先度のタスクの場合、追加した順番に処理する。
例えばもし同じ優先度のタスクA、タスクB、タスクCがあるとする。
TaskA = RegisterNewTask( task_sys ) ;
TaskB = RegisterNewTask( task_sys ) ;
TaskC = RegisterNewTask( task_sys ) ;
のようにした場合、A→B→Cの順に処理する。

実装例を見る
目次に戻る

9・IsDeinitTaskSys関数:タスクシステムの後始末

宣言

bool IsDenitTaskSys(
    TaskSystem* p_task_sys
) ;

概略
タスクシステムが確保したメモリを開放する

引数
p_task_sys : 対象のタスクシステム

戻り値
true : 成功
false : 失敗

解説
InitTaskSys関数と対になる関数。
メモリリークなどの問題につながる恐れがあるため、必ず呼び出すこと

実装例を見る
目次に戻る

10・GetAllTaskSize関数:全タスクの合計サイズを取得

宣言

inline unsigned int GetAllTaskSize(
    TaskSystem* p_task_sys
) ;

概略
タスクシステムに登録された全てのタスクの合計サイズを取得する

引数
p_task_sys : 対象のタスクシステム

戻り値
全タスクの合計サイズ(バイト単位)

解説
inlineを用いてインライン関数化しているだけで、戻り値はunsingned int型。

実装例を見る
目次に戻る

11・GetAllTaskNum関数:全タスクの合計数を取得

宣言

inline unsigned int GetAllTaskNum(
    TaskSystem* p_task_sys
) ;

概略
タスクシステムに登録された全てのタスクの合計数を取得する

引数
p_task_sys : 対象のタスクシステム

戻り値
全タスクの合計数

解説
inlineを用いてインライン関数化しているだけで、戻り値はunsingned int型。

実装例を見る
目次に戻る

12・GetActiveTaskSize関数 :有効タスクの合計サイズを取得

宣言

inline unsigned int GetActiveTaskSize(
    TaskSystem* p_task_sys
) ;

概略
アクティブになっているタスクの合計サイズを取得する

引数
p_task_sys : 対象のタスクシステム

戻り値
アクティブタスクの合計サイズ(バイト単位)

解説
inlineを用いてインライン関数化しているだけで、戻り値はunsingned int型。

実装例を見る
目次に戻る

13・GetActiveTaskNum関数:有効タスクの合計数を取得

宣言

inline unsigned int GetActiveTaskNum(
    TaskSystem* p_task_sys
) ;

概略
アクティブになっているタスクの合計数を取得する

引数
p_task_sys : 対象のタスクシステム

戻り値
アクティブタスクの合計数

解説
inlineを用いてインライン関数化しているだけで、戻り値はunsingned int型。

実装例を見る
目次に戻る

14・GetInactiveTaskSize関数 :無効タスクの合計サイズを取得

宣言

inline unsigned int GetInactiveTaskSize(
    TaskSystem* p_task_sys
) ;

概略
非アクティブになっているタスクの合計サイズを取得する

引数
p_task_sys : 対象のタスクシステム

戻り値
非アクティブタスクの合計サイズ(バイト単位)

解説
inlineを用いてインライン関数化しているだけで、戻り値はunsingned int型。

実装例を見る
目次に戻る

15・GetInactiveTaskNum関数:無効タスクの合計数を取得

宣言

inline unsigned int GetInactiveTaskNum(
    TaskSystem* p_task_sys
) ;

概略
非アクティブになっているタスクの合計数を取得する
引数
p_task_sys : 対象のタスクシステム
戻り値
非アクティブタスクの合計数
解説
inlineを用いてインライン関数化しているだけで、戻り値はunsingned int型。

実装例を見る
目次に戻る


実装例

#include <stdio.h>
#include "tasksyslib.h"

void PrintPlayerName( Task* player_t ) {
    char *str = ( char * ) player_t->p_resource ;
    printf( "%s\n", str ) ;
}

void PrintState( TaskSystem *p_task_sys ) {
    printf( "All Task Size      = %d byte\n", GetAllTaskSize( p_task_sys ) ) ;
    printf( "All Task Num       = %d\n", GetAllTaskNum( p_task_sys ) ) ;
    printf( "Active Task Size   = %d byte\n", GetActiveTaskSize( p_task_sys ) ) ;
    printf( "Active Task Num    = %d\n", GetActiveTaskNum( p_task_sys ) ) ;
    printf( "Inactive Task Size = %d byte\n", GetInactiveTaskSize( p_task_sys ) ) ;
    printf( "Inactive Task Num  = %d\n", GetInactiveTaskNum( p_task_sys ) ) ;
}

int main() {
    //タスクシステムの初期化
    TaskSystem* draw_ts = InitTaskSys( 100 ) ;

    //タスクの登録
    Task* playerA_t = RegisterNewTask( draw_ts ) ; 
    Task* playerB_t = RegisterNewTask( draw_ts ) ;
    Task* playerC_t = RegisterNewTask( draw_ts ) ;
    Task* playerD_t = RegisterNewTask( draw_ts ) ;

    //タスクの設定
    SetTaskParameter( playerA_t, 3, &PrintPlayerName, "John" ) ;
    SetTaskParameter( playerB_t, 2, &PrintPlayerName, "David" ) ;
    SetTaskParameter( playerC_t, 1, &PrintPlayerName, "Richard" ) ;
    SetTaskParameter( playerD_t, 1, &PrintPlayerName, "Robert" ) ;

    //タスクをアクティブにする
    if( !IsActivateRegdTask( draw_ts, playerA_t ) ) {
        return 1 ; //エラー処理
    }
    if( !IsActivateRegdTask( draw_ts, playerB_t ) ) {
        return 1 ;
    }
    if( !IsActivateRegdTask( draw_ts, playerC_t ) ) {
        return 1 ;
    }
    if( !IsActivateRegdTask( draw_ts, playerD_t ) ) {
        return 1 ;
    }

    //タスクを実行する
    if( !IsCallActiveFunc( draw_ts ) ) {
        return 1 ;
    }
    
    PrintState( draw_ts ) ;
    printf( " _ _ _ _ _ _ _ _ _ _ _\n" ) ;

//______________________________________________________________
    //タスクBを非アクティブ化
    if( !IsDeactivateRegdTask( draw_ts, playerB_t ) ) {
        return 1 ;
    }

    //タスクを実行する
    if( !IsCallActiveFunc( draw_ts ) ) {
        return 1 ;
    }
    
    PrintState( draw_ts ) ;
    printf( " _ _ _ _ _ _ _ _ _ _ _\n" ) ;

//______________________________________________________________
    //非アクティブタスク、つまりBを削除
    if( !IsDelAllInactiveTask( draw_ts ) ) {
        return 1 ;
    } 

    //タスクCを削除
    if( !IsDelTask( draw_ts, playerC_t ) ) {
        return 1 ;
    }

    //タスクを実行する
    if( !IsCallActiveFunc( draw_ts ) ) {
        return 1 ;
    }
    
    PrintState( draw_ts ) ;

//______________________________________________________________
    if( !IsDeinitTaskSys( draw_ts )  ) {
        return 1 ;
    }
    return 0 ; //正常終了
}



実行結果

John
David
Richard
Robert
All Task Size      = 112 byte
All Task Num       = 4
Active Task Size   = 112 byte
Active Task Num    = 4
Inactive Task Size = 0 byte
Inactive Task Num  = 0
 _ _ _ _ _ _ _ _ _ _ _
John
Richard
Robert
All Task Size      = 112 byte
All Task Num       = 4
Active Task Size   = 84 byte
Active Task Num    = 3
Inactive Task Size = 28 byte
Inactive Task Num  = 1
 _ _ _ _ _ _ _ _ _ _ _
John
Robert
All Task Size      = 56 byte
All Task Num       = 2
Active Task Size   = 56 byte
Active Task Num    = 2
Inactive Task Size = 0 byte
Inactive Task Num  = 0

目次に戻る


上記の例ではタスクの操作をわかりやすくするために処理関数を複数呼び出していますが、ゲーム等で使うときは、whileループ等で周期的に呼ばれるようにするとよいと思います。


以上がリファレンスです。
誤字脱字、ライブラリ自体のバグ等を発見次第コメント欄等で指摘して頂けると幸いです。
他にも質問などもお気軽にお寄せください。
では。