00001
00002
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
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
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 }