Mercurial > hg > Members > kono > Cerium
view TaskManager/Test/simple_render/main.cpp @ 42:aa11038dbdc1
*** empty log message ***
author | gongo |
---|---|
date | Thu, 14 Feb 2008 18:27:37 +0900 |
parents | 1e17e0b441a7 |
children | 70a0ac46133e |
line wrap: on
line source
#include <iostream> #include "viewer.h" #include "polygon.h" #include "demonstration.h" #include "pad.h" #include "TaskManager.h" using namespace std; int init(void*, void*); int sdl_init(void*, void*); int zrow_init(void*, void*); int run(void*, void*); int finish(void*, void*); extern int run_init(); TaskManager *manager; Viewer *screen; extern void task_initialize(void); struct init_arg { int bpp; int w; int h; }; int init(void *w, void *_arg) { struct init_arg *arg; int fd_sdl_init, fd_zrow_init, fd_run, fd_finish; HTaskPtr task_sdl_init, task_zrow_init, task_run, task_finish; arg = (struct init_arg *)_arg; screen = new Viewer(arg->bpp, arg->w, arg->h); fd_sdl_init = manager->open("sdl_init"); fd_zrow_init = manager->open("zRow_init"); fd_run = manager->open("run"); fd_finish = manager->open("finish"); // こっから下は一つの関数だと確かに簡単 // 複数の依存がある場合はどうしようかな。 // 可変引数にするわけにもいかないし。 // その時は set_task_depend を自分で呼ぶ? // でもそれだと、結局自分で書いた方が早い気も。 task_sdl_init = manager->create_task(fd_sdl_init, 0, 0, 0, NULL); task_zrow_init = manager->create_task(fd_zrow_init, 0, 0, 0, NULL); task_run = manager->create_task(fd_run, 0, 0, 0, NULL); task_finish = manager->create_task(fd_finish, 0, 0, 0, NULL); manager->set_task_depend(task_sdl_init, task_run); manager->set_task_depend(task_zrow_init, task_run); manager->set_task_depend(task_run, task_finish); //task_sdl_init->set_depend(..); //task_sdl_init->spawn(); manager->spawn_task(task_sdl_init); manager->spawn_task(task_zrow_init); manager->spawn_task(task_run); manager->spawn_task(task_finish); free(arg); return 0; } // クラス関数は単純にポインタで扱えないので // 現状は間接的に呼ぶことに int sdl_init(void *w, void *r) { screen->sdl_init(); return 0; } int zRow_init(void *w, void *r) { screen->zRow_init(); return 0; } int run(void *w, void *r) { screen->run(); return 0; } int finish(void *w, void *r) { delete screen; return 0; } // 上の init() が代わりに動いてます int run_test(int bpp, int width, int height) { Viewer *screen; screen = new Viewer(bpp, width, height); //screen->init(); screen->sdl_init(); //Scene *scene; //scene = new Scene; screen->zRow_init(); //screen->scene = scene; screen->run(); //delete scene; delete screen; return(0); } int main(int argc, char *argv[]) { manager = new TaskManager(1); manager->init(); task_initialize(); // 本当は、dlsym みたいなものを使いたいんだけど // 静的なやつはできないん? manager->set_symbol("init", (void*)init); manager->set_symbol("sdl_init", (void*)sdl_init); manager->set_symbol("zRow_init", (void*)zRow_init); manager->set_symbol("run", (void*)run); manager->set_symbol("finish", (void*)finish); int bpp = 0; int width = 640; int height = 480; for(int i = 1; argv[i]; ++i) { if (strcmp(argv[i], "-bpp") == 0) { bpp = atoi(argv[++i]); } if (strcmp(argv[i], "-width") == 0) { width = atoi(argv[++i]); } if (strcmp(argv[i], "-height") == 0) { height = atoi(argv[++i]); } } #if 1 run_test(bpp, width, height); #else // 一番最初に行われる init 専用の task_run があってもいいけど。。 // その場合は引数とか固定か。まあ引数は argc, argv を持つ // 構造体で固定しても問題はない・・・か? HTaskPtr task_init; int fd_init; struct init_arg *arg = new struct init_arg; arg->bpp = bpp; arg->w = width; arg->h = height; fd_init = manager->open("init"); task_init = manager->create_task(fd_init, sizeof(struct init_arg), (unsigned int)arg, 0, NULL); manager->spawn_task(task_init); manager->run(); #endif return 0; }