なんちゃってタスクシステム

アバター
Ciel
記事: 252
登録日時: 15年前

なんちゃってタスクシステム

投稿記事 by Ciel » 15年前

2週間ぐらい前に考えたタスクシステムです。

CODE:

#ifndef TASK_H
#define TASK_H

#include "Pch.h"
#include 
#include 

#define PRIORITY_MAX 1.0f

template  class TASK{

public:
	typedef void (T::*T1)();
	typedef T* T2;
private:
	typedef std::multimap map;
	map data;

public:
	void SetList(T1 p,float pri);
	void DeleteList(T1 p);
	void TaskRun(T2 th);
};

template  void TASK::SetList(T1 p,float pri)
{
	data.insert(std::make_pair(pri, p));
}

template  void TASK::DeleteList(T1 p)
{
	map::iterator cur = data.begin(), end = data.end();

	while (cur != end)
		if (cur->second == p)
			//cur++だからこのときはまだ現在の値を消して終わったらcurが進む。
			data.erase(cur++);
		else
			++cur;
}

template  void TASK::TaskRun(T2 th)
{
	
	// 実行する関数内での登録削除を許可するため、先にコンテナに対する
	// 操作を全て済ませておきます。
	map::const_iterator cur=data.begin(),end=data.end();

	//退避用vector(関数ポインタ型のリスト)
	typedef std::vector vector;
	//リストの数分のvectorリストを確保
	vector heap(data.size());

	vector::iterator vcur=heap.begin();
	vector::const_iterator vend;


	for(;cur!=end;++cur){
		*vcur=cur->second;
		++vcur;
	}

	vcur=heap.begin();
	vend=heap.end();

	//vectorに退避させた関数を実行。
	for(;vcur!=vend;++vcur){
		(th->*(*vcur))();
	}

	//STLコンテナなので解放処理とかは必要なし。

}

#endif
最初の頃に比べると大分すっきりしましたね。
最初はSTLを使わずに表現してたので、大分汚かったです。
が、助言を頂いてからはSTLを積極的に使っていってます。

シーケンス制御で悩んでいる方は、タスクシステムを勉強することをお勧めします。

本当にちょっと感動します。

管理が難しいけどね(ぼそっ)

アバター
TororoShinku
記事: 67
登録日時: 15年前

Re: なんちゃってタスクシステム

投稿記事 by TororoShinku » 15年前

おぉ 遥かに自分の作ったものより使いやすい。。。

見習います!

アバター
Ciel
記事: 252
登録日時: 15年前

Re: なんちゃってタスクシステム

投稿記事 by Ciel » 15年前

>>Tororo Shinkuさん

コメントありがとうございます。

まだC++始めて3ヶ月ぐらいしか経っておらず、まだまだ経験不足なので、あまり参考にしないほうがいいですよ。

ちなみにこのタスクシステムはvoid型の引数と戻り値を持つ関数ポインタでタスクシステムを実現しています。

なので、型が違ったりした時点でアウトですw

だから、あんまり使えないですw
もうちょっと大きなくくりでのタスクシステムは別で作ってあります。

なのでこの貼ってあるタスクシステムは、各クラス内での処理をまとめるための、簡易タスクシステムですかね。

アバター
MNS
記事: 35
登録日時: 15年前

Re: なんちゃってタスクシステム

投稿記事 by MNS » 15年前

コード読ませていただきました。
ざっと見た感じでは、登録された関数を、
優先順位でソートして、それに基づいて呼出、
というようなシステムなのでしょうか、
なんとなくタスクシステムについて分かった気がします[e]140[/e]

これでは確かに、一定の引数、戻り値に限られますが、
>もうちょっと大きなくくりでのタスクシステムは別で作ってあります。
どういったアプローチで汎用性を高めたのでしょうか?
興味があります。差し障りがなければ教えてください[e]198[/e]

アバター
Ciel
記事: 252
登録日時: 15年前

Re: なんちゃってタスクシステム

投稿記事 by Ciel » 15年前

>>MNSさん。
コメントありがとうございます。

>どういったアプローチで汎用性を高めたのでしょうか?
>興味があります。差し障りがなければ教えてください

これはちょっと説明が難しいんですが、
ある抽象クラスがあって、そのクラスには仮想関数をいくつか持たせてあります。
この抽象クラスを継承した派生クラスを幾つか作ります。
そして、この派生クラス側で上記の簡易タスククラスをメンバに持たせ、クラス内の処理はこのタスクシステムを使って処理します。

そして、この派生クラスをまとめるために、もっと大きいタスクシステムがあるんですが、登録する型として、
抽象クラスのポインタを型としています。
こうすることによって、派生クラスのポインタでも代入することができ、かつ定義しといた仮想関数を使ってループさせることができます。
これが上位レベルでのタスクシステムになります。

超大雑把に説明するとこんな感じですw

アバター
MNS
記事: 35
登録日時: 15年前

Re: なんちゃってタスクシステム

投稿記事 by MNS » 15年前

なるほど、いくつかにタスクシステムを区分し、
それを上位システムで統括するような感じでしょうか。
とても勉強になります[e]140[/e]

それにしても、ここは気軽に情報交換が出来て良いですね。
この先とても役立ちそうな気がします(´▽`)