EvilTaskManager
をテンプレートにして作成
Check
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#counter
* shared_ptrを要求する邪悪なマネージャー [#ja8d4121]
C++11で標準実装された、参照カウンタ方式によるポインタ'sha...
古来のC++でもboostライブラリにより利用かのなので、すっか...
なにせ、newしてもdeleteしなくて良いというお手軽さ。誰から...
初期のboostライブラリから実装されていたこともあり、shared...
- shared_ptrをコンテナに入れて保持している
- シングルトン実装で、コンテナの解放はアプリケーション終...
- 格納されるクラスが、ポインタや参照で他のクラスオブジェ...
これらの要件を満たしているクラスを使うと、便利でお手軽なs...
たとえば、こんなクラスです
#sh(cpp){{
// イケてないタスクマネージャー
struct EvilTaskManager {
// 管理されるタスククラスのインターフェイスクラス
struct Task {
virtual void update() = 0;
};
// タスクリストをshared_ptrを使って保持
vector<shared_ptr<Task>> tasks_;
// タスクリストにタスクを追加
void addTask(shared_ptr<Task> task) {
tasks_.push_back(task);
}
// タスクリストのすべてのタスクのupdate()を呼び出す。
void doUpdate() {
for (auto& task : tasks_) task->update();
}
// タスクリストをクリア
void clear() {
tasks_.clear();
}
// シングルトン実装です
static EvilTaskManager& instance() {
static EvilTaskManager me;
return me;
}
};
}}
こんな風に使います
#sh(cpp){{
// 毎フレーム呼ばれるなんらかのタスク
struct MyTask : EvilTaskManager::Task {
ostream& os_; // メッセージ出力用のストリーム
MyTask(ostream& os) : os_(os) {}
// 毎フレームの処理
void update() override {
os_ << "update MyTask" << endl;
}
// デストラクタでもメッセージを出す
~MyTask() {
os_ << "MyTask is gone." << endl;
}
};
void main() {
ofstream outmsg("message.txt");
// MyTaskをタスクマネージャーに登録
EvilTaskManager::instance().addTask(new MyTask(outmsg));
// メインループのつもり
bool is_running = true;
while (is_running) {
// ここで、MyTaskのupdate()が毎フレーム呼ばれる
EvilTaskManager::instance().doUpdate();
// render and wait vsync etc...
// 終わる時は、is_running = falseとする
}
}
}}
MyTaskは、メッセージ出力用のストリームを受け取って、仕事...
自分が消滅するときにも、ご丁寧にメッセージを出します。
しかし、このプログラムは動作しません。お分かりと思います...
その時には、ofstream outmsgは忘却の彼方へ旅立っており、ア...
上記はシンプルな例なので解決策は簡単に施せますが、シング...
特に、ゲームプログラムの場合はリソースの管理が複雑になり...
MyTaskの実装上の問題は、ostreamが使用不能になる前に、タス...
#sh(cpp){{
while (is_running) {
// ここで、MyTaskのupdate()が毎フレーム呼ばれる
EvilTaskManager::instance().doUpdate();
// render and wait vsync etc...
// 終わる時は、is_running = falseとする
}
EvilTaskManager::instance().clear(); // これで解決!
}
}}
終了行:
#counter
* shared_ptrを要求する邪悪なマネージャー [#ja8d4121]
C++11で標準実装された、参照カウンタ方式によるポインタ'sha...
古来のC++でもboostライブラリにより利用かのなので、すっか...
なにせ、newしてもdeleteしなくて良いというお手軽さ。誰から...
初期のboostライブラリから実装されていたこともあり、shared...
- shared_ptrをコンテナに入れて保持している
- シングルトン実装で、コンテナの解放はアプリケーション終...
- 格納されるクラスが、ポインタや参照で他のクラスオブジェ...
これらの要件を満たしているクラスを使うと、便利でお手軽なs...
たとえば、こんなクラスです
#sh(cpp){{
// イケてないタスクマネージャー
struct EvilTaskManager {
// 管理されるタスククラスのインターフェイスクラス
struct Task {
virtual void update() = 0;
};
// タスクリストをshared_ptrを使って保持
vector<shared_ptr<Task>> tasks_;
// タスクリストにタスクを追加
void addTask(shared_ptr<Task> task) {
tasks_.push_back(task);
}
// タスクリストのすべてのタスクのupdate()を呼び出す。
void doUpdate() {
for (auto& task : tasks_) task->update();
}
// タスクリストをクリア
void clear() {
tasks_.clear();
}
// シングルトン実装です
static EvilTaskManager& instance() {
static EvilTaskManager me;
return me;
}
};
}}
こんな風に使います
#sh(cpp){{
// 毎フレーム呼ばれるなんらかのタスク
struct MyTask : EvilTaskManager::Task {
ostream& os_; // メッセージ出力用のストリーム
MyTask(ostream& os) : os_(os) {}
// 毎フレームの処理
void update() override {
os_ << "update MyTask" << endl;
}
// デストラクタでもメッセージを出す
~MyTask() {
os_ << "MyTask is gone." << endl;
}
};
void main() {
ofstream outmsg("message.txt");
// MyTaskをタスクマネージャーに登録
EvilTaskManager::instance().addTask(new MyTask(outmsg));
// メインループのつもり
bool is_running = true;
while (is_running) {
// ここで、MyTaskのupdate()が毎フレーム呼ばれる
EvilTaskManager::instance().doUpdate();
// render and wait vsync etc...
// 終わる時は、is_running = falseとする
}
}
}}
MyTaskは、メッセージ出力用のストリームを受け取って、仕事...
自分が消滅するときにも、ご丁寧にメッセージを出します。
しかし、このプログラムは動作しません。お分かりと思います...
その時には、ofstream outmsgは忘却の彼方へ旅立っており、ア...
上記はシンプルな例なので解決策は簡単に施せますが、シング...
特に、ゲームプログラムの場合はリソースの管理が複雑になり...
MyTaskの実装上の問題は、ostreamが使用不能になる前に、タス...
#sh(cpp){{
while (is_running) {
// ここで、MyTaskのupdate()が毎フレーム呼ばれる
EvilTaskManager::instance().doUpdate();
// render and wait vsync etc...
// 終わる時は、is_running = falseとする
}
EvilTaskManager::instance().clear(); // これで解決!
}
}}
ページ名: