so now i have wrote my first parallel processing application. of course it makes no sense at two objects, to process the distance twice times . but i know excatly how i will use this at smashBALL. or in overall at my raster based particle system
im just curious, few hours ago, i painted my objects in the threads and it worked. but i have no idea what i have done, i cant reproduce it. now, if im trying it, my application crashs after some paintings. thats why im using now a task for store the parallel processed values. i think its related to the main_loop, i think, i asked this a long time ago, but how can i stop the main_loop? i asked it for python, or i need to set the global clock synchron to my threads? maybe this could fix this too.
anyway, i can store my datas in vector 3, it wont make a difference, it just a bit more work to change my code.
im very proud of me!
greetz
logans run
// PARALLEL PROCESSING -> parallel processing of two distances, this should just display how to parallel processing, of course there is no need to do this twice! ;)
// this processing idea was just coming along to improve the performance at the raster particles for smashBALL, now im able to split my particle calculation up!
// it should improve the performance up to 30 % or more! :D :D :D i hope! but im sure it does :D
// drh 2010
#include "pandaFramework.h"
#include "pandaSystem.h"
#include "graphicsEngine.h"
#include "process.h"
#include "windows.h"
PandaFramework framework;
WindowFramework *window;
GraphicsEngine *engine;
PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();
PT(ClockObject) globalClock = ClockObject::get_global_clock();
NodePath camera,model[2];
//init the start position
LVecBase3f pos1 (0.8,0.0,0.0),pos2 (-0.8,0.0,0.0);
//parallel processing related
// declare the parallel processing vars
float dis,dis1;
int isACTIVE = 1;
void parallelDISTANCEcalc1 (void *);
void parallelDISTANCEcalc2 (void *);
//window open
void windowOPEN() {
WindowProperties *props = new WindowProperties();
props->set_size(500,500);
props->set_origin(500,10);
props->set_undecorated(true);
window = framework.open_window(*props,0);
window->get_graphics_window()->get_active_display_region(0)->set_clear_color(Colorf(0,0,0,1));
}
// stor camera
void getCAMERA() {
camera = window->get_camera_group();
}
// load model
void loadMODEL() {
for (int i=0;i<2;i++) {
model[i] = window->load_model(framework.get_models(),"smiley");
model[i].set_scale(.1);
model[i].reparent_to(window->get_aspect_2d());
}
}
//parallel processing
void parallelDISTANCEcalc1 (void *) {
while (isACTIVE) {
LVecBase3f disX = (pos1-pos2);
dis = disX.length();
if (dis < .1) {
pos1.set_x(pos1.get_x());
}
else {
pos1.set_x(pos1.get_x()-.005);
}
Sleep(10);
}
}
void parallelDISTANCEcalc2 (void *) {
while (isACTIVE) {
LVecBase3f disX = (pos1-pos2);
dis1 = disX.length();
if (dis1 < .1) {
pos2.set_x(pos2.get_x());
}
else {
pos2.set_x(pos2.get_x()+.005);
}
Sleep(10);
}
}
AsyncTask::DoneStatus mainTASK(GenericAsyncTask* task, void* data) {
model[0].set_x(pos1.get_x());
model[1].set_x(pos2.get_x());
return AsyncTask::DS_cont;
}
int main(int argc, char *argv[]) {
framework.open_framework(argc, argv);
windowOPEN();
getCAMERA();
loadMODEL();
_beginthread(parallelDISTANCEcalc1, 0, NULL);
_beginthread(parallelDISTANCEcalc2, 0, NULL);
taskMgr->add(new GenericAsyncTask("main task", &mainTASK, (void*) NULL));
framework.main_loop();
framework.close_framework();
return (0);
}