threadsh1.C

Go to the documentation of this file.
00001 //+ Example of a simple script creating 3 threads.
00002 // This script can only be executed via ACliC .x threadsh1.C++.
00003 
00004 #include "TCanvas.h"
00005 #include "TFrame.h"
00006 #include "TH1F.h"
00007 #include "TRandom.h"
00008 #include "TThread.h"
00009 
00010 
00011 TCanvas *c[4];
00012 TH1F    *hpx[4];
00013 TThread *t[5];
00014 Bool_t finished;
00015 
00016 void *handle(void *ptr)
00017 {
00018    long nr = (long) ptr;
00019    int nfills = 2500000;
00020    int upd = 5000;
00021 
00022    char name[32];
00023    sprintf(name,"hpx%ld",nr);
00024    TThread::Lock();
00025    hpx[nr] = new TH1F(name,"This is the px distribution",100,-4,4);
00026    hpx[nr]->SetFillColor(48);
00027    TThread::UnLock();
00028    Float_t px, py, pz;
00029    gRandom->SetSeed();
00030    for (Int_t i = 0; i < nfills; i++) {
00031       gRandom->Rannor(px,py);
00032       pz = px*px + py*py;
00033       hpx[nr]->Fill(px);
00034       if (i && (i%upd) == 0) {
00035          if (i == upd) {
00036             TThread::Lock();
00037             c[nr]->cd();
00038             hpx[nr]->Draw();
00039             TThread::UnLock();
00040          }
00041          c[nr]->Modified();
00042          gSystem->Sleep(10);
00043       }
00044    }
00045    return 0;
00046 }
00047 
00048 void *joiner(void *)
00049 {
00050    t[0]->Join();
00051    t[1]->Join();
00052    t[2]->Join();
00053    t[3]->Join();
00054 
00055    finished = kTRUE;
00056 
00057    return 0;
00058 }
00059 
00060 void threadsh1()
00061 {
00062 #ifdef __CINT__
00063    printf("This script can only be executed via ACliC: .x threadsh1.C++\n");
00064    return;
00065 #endif
00066 
00067    finished = kFALSE;
00068    //gDebug = 1;
00069 
00070    c[0] = new TCanvas("c0","Dynamic Filling Example",100,20,400,300);
00071    c[0]->SetFillColor(42);
00072    c[0]->GetFrame()->SetFillColor(21);
00073    c[0]->GetFrame()->SetBorderSize(6);
00074    c[0]->GetFrame()->SetBorderMode(-1);
00075    c[1] = new TCanvas("c1","Dynamic Filling Example",510,20,400,300);
00076    c[1]->SetFillColor(42);
00077    c[1]->GetFrame()->SetFillColor(21);
00078    c[1]->GetFrame()->SetBorderSize(6);
00079    c[1]->GetFrame()->SetBorderMode(-1);
00080    c[2] = new TCanvas("c2","Dynamic Filling Example",100,350,400,300);
00081    c[2]->SetFillColor(42);
00082    c[2]->GetFrame()->SetFillColor(21);
00083    c[2]->GetFrame()->SetBorderSize(6);
00084    c[2]->GetFrame()->SetBorderMode(-1);
00085    c[3] = new TCanvas("c3","Dynamic Filling Example",510,350,400,300);
00086    c[3]->SetFillColor(42);
00087    c[3]->GetFrame()->SetFillColor(21);
00088    c[3]->GetFrame()->SetBorderSize(6);
00089    c[3]->GetFrame()->SetBorderMode(-1);
00090 
00091    printf("Starting Thread 0\n");
00092    t[0] = new TThread("t0", handle, (void*) 0);
00093    t[0]->Run();
00094    printf("Starting Thread 1\n");
00095    t[1] = new TThread("t1", handle, (void*) 1);
00096    t[1]->Run();
00097    printf("Starting Thread 2\n");
00098    t[2] = new TThread("t2", handle, (void*) 2);
00099    t[2]->Run();
00100    printf("Starting Thread 3\n");
00101    t[3] = new TThread("t3", handle, (void*) 3);
00102    t[3]->Run();
00103    printf("Starting Thread 4\n");
00104    t[4] = new TThread("t4", joiner, (void*) 3);
00105    t[4]->Run();
00106 
00107    TThread::Ps();
00108 
00109    while (!finished) {
00110       for (int i = 0; i < 4; i++) {
00111          if (c[i]->IsModified()) {
00112             //printf("Update canvas %d\n", i);
00113             c[i]->Update();
00114          }
00115       }
00116       gSystem->Sleep(100);
00117       gSystem->ProcessEvents();
00118    }
00119 
00120    t[4]->Join();
00121    TThread::Ps();
00122 
00123    delete t[0];
00124    delete t[1];
00125    delete t[2];
00126    delete t[3];
00127    delete t[4];
00128 }

Generated on Tue Jul 5 15:45:10 2011 for ROOT_528-00b_version by  doxygen 1.5.1