ただのメモ

開発で得た知識のアウトプット

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

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


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

宣言

TaskSystem* InitTaskSys(
    unsigned int max_task_num
) ;

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

引数

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

戻り値

メモリアドレス 成功
NULL 失敗

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

実装例を見る
目次に戻る

RegisterNewTask関数:タスクの登録

宣言

Task* RegisterNewTask(
    TaskSystem *p_task_sys
) ;

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

引数

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

戻り値

メモリアドレス 成功
NULL 失敗

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

実装例を見る
目次に戻る

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ポインタ。データを取り出すときには一度キャストしたほうが良い

実装例を見る
目次に戻る

IsActivateRegdTask関数:タスクを有効化

宣言

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

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

引数

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

戻り値

true 成功
false 失敗

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

実装例を見る
目次に戻る

IsDeactivateRegdTask関数:タスクを無効化

宣言

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

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

引数

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

戻り値

true 成功
false 失敗

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

実装例を見る
目次に戻る

IsDelTask関数:タスクを削除

宣言

bool IsDelTask(
    TaskSystem* p_task_sys,
    Task*       p_regd_task
)

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

引数

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

戻り値

true 成功
false 失敗

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

実装例を見る
目次に戻る

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

宣言

bool IsDelAllInactiveTask(
    TaskSystem* p_task_sys,
    Task*       p_regd_task
)

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

引数

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

戻り値

true 成功
false 失敗

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

実装例を見る
目次に戻る

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の順に処理する。

実装例を見る
目次に戻る

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

宣言

bool IsDenitTaskSys(
    TaskSystem* p_task_sys
) ;

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

引数

p_task_sys 対象のタスクシステム

戻り値

true 成功
false 失敗

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

実装例を見る
目次に戻る

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

宣言

inline unsigned int GetAllTaskSize(
    TaskSystem* p_task_sys
) ;

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

引数

p_task_sys 対象のタスクシステム

戻り値

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

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

実装例を見る
目次に戻る

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

宣言

inline unsigned int GetAllTaskNum(
    TaskSystem* p_task_sys
) ;

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

引数

p_task_sys 対象のタスクシステム

戻り値

全タスクの合計数

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

実装例を見る
目次に戻る

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

宣言

inline unsigned int GetActiveTaskSize(
    TaskSystem* p_task_sys
) ;

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

引数

p_task_sys 対象のタスクシステム

戻り値

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

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

実装例を見る
目次に戻る

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

宣言

inline unsigned int GetActiveTaskNum(
    TaskSystem* p_task_sys
) ;

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

引数

p_task_sys 対象のタスクシステム

戻り値

アクティブタスクの合計数

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

実装例を見る
目次に戻る

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

宣言

inline unsigned int GetInactiveTaskSize(
    TaskSystem* p_task_sys
) ;

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

引数

p_task_sys 対象のタスクシステム

戻り値

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

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

実装例を見る
目次に戻る

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ループ等で周期的に呼ばれるようにするとよいと思います。


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