[ROOT] thread / display update

From: Peter Christ (christ@mppmu.mpg.de)
Date: Thu Oct 04 2001 - 13:27:52 MEST


Hi,

I'm totally new to ROOT and I plan to use it to develop a program for
data-aquisition. For that the data display should be updated whenever
new data are available (rate: few/s to 1/10s). 
The problem: the display should not be locked then i.e. it should be
possible to change ranges etc.
Is that possible - and how?

I made some tests by changing the samplemacro 'conditions' (see changed
part of the code below). But at the line ' h1->Draw(); ' it crashes with
'***break*** segmentation violation'.

Can anybody help?

Many thanks in advance,

Peter

-- 

part of modified 'conditions.cxx' :
....

/////////////////////////////////////////////
// functions used within second thread:

void *thread2(void *ptr)
{
  Int_t count = 0;
  Int_t meid=2;

    Int_t n = 20;
    Int_t wait=0;
    Double_t x[n], y[n], x1[n], y1[n];

  meid=TThread::SelfId();
  TThread::CleanUpPush((void*) &clean2, (void*) NULL);
  TThread::SetCancelOn(); // enable cancellation from thread1
  TThread::SetCancelDeferred();

    for (Int_t i=0;i<n;i++){
	x[i]=i*0.5;
	y[i]=5*cos(x[i]);
	x1[i]=i*0.5;
	y1[i]=5*sin(x[i]);
    }
    cout << "hier thread2 a" << endl;
    TThread::Lock();
    cout << "hier thread2 b" << endl;
    TCanvas *c1 =new TCanvas("c1","graphtest",200,10,600,400);
    cout << "hier thread2 c" << endl;
    TH2D *h1 = new TH2D("h1","titelll",30,0,15,30,-2,5);
    cout << "hier thread2 d" << endl;
    cout << "hier thread2 e" << endl;
    TGraph *gr1 = new TGraph(n,x,y);
    cout << "hier thread2 f" << endl;
    gr1->Draw("AL");
    cout << "hier thread2 g" << endl;
    c1->Update();
    TThread::UnLock();

  while(1) {
        for (Int_t i=0;i<n;i++){
	   x[i]=i*0.5;
	   y[i]=5*cos(x[i]+count*0.1);
	   x1[i]=i*0.5;
	   y1[i]=5*sin(x[i]+count*0.1);
        }
        delete gr1;
        TGraph *gr1 = new TGraph(n,x,y);
        gr1->Draw("L");
        c1->Update();

        myCondition.Wait();
        gSystem->Sleep(1000*count); // increase time to induce thread1
timeout..
        myAckn.Signal(); //acknowledge myCondition
        count++; // counter for correctly received conditions
        cout << "\n\tthread2 "<<meid << ": got myCondition!
count:"<<count <<endl;

  }

 
}

void clean2(void* arg)
{
  // demonstrates cleanup stack
  // this function will _not_ be executed if thread 2 is cancelled 
  cout << "\n## thread2 cleanup function"<<endl;
}


./////////////////////////////////////////////
// functions used within second thread:

void *thread2(void *ptr)
{
  Int_t count = 0;
  Int_t meid=2;

    Int_t n = 20;
    Int_t wait=0;
    Double_t x[n], y[n], x1[n], y1[n];

  meid=TThread::SelfId();
  TThread::CleanUpPush((void*) &clean2, (void*) NULL);
  TThread::SetCancelOn(); // enable cancellation from thread1
  TThread::SetCancelDeferred();

    for (Int_t i=0;i<n;i++){
	x[i]=i*0.5;
	y[i]=5*cos(x[i]);
	x1[i]=i*0.5;
	y1[i]=5*sin(x[i]);
    }
    cout << "hier thread2 a" << endl;
    TThread::Lock();
    cout << "hier thread2 b" << endl;
    TCanvas *c1 =new TCanvas("c1","graphtest",200,10,600,400);
    cout << "hier thread2 c" << endl;
    TH2D *h1 = new TH2D("h1","titelll",30,0,15,30,-2,5);
    cout << "hier thread2 d" << endl;
    h1->Draw();
    cout << "hier thread2 e" << endl;
    TGraph *gr1 = new TGraph(n,x,y);
    cout << "hier thread2 f" << endl;
    gr1->Draw("AL");
    cout << "hier thread2 g" << endl;
    c1->Update();
    TThread::UnLock();

  while(1) {
        for (Int_t i=0;i<n;i++){
	   x[i]=i*0.5;
	   y[i]=5*cos(x[i]+count*0.1);
	   x1[i]=i*0.5;
	   y1[i]=5*sin(x[i]+count*0.1);
        }
        delete gr1;
        TGraph *gr1 = new TGraph(n,x,y);
        gr1->Draw("L");
        c1->Update();

        myCondition.Wait();
        gSystem->Sleep(1000*count); // increase time to induce thread1
timeout..
        myAckn.Signal(); //acknowledge myCondition
        count++; // counter for correctly received conditions
        cout << "\n\tthread2 "<<meid << ": got myCondition!
count:"<<count <<endl;

  }

 
}

void clean2(void* arg)
{
  // demonstrates cleanup stack
  // this function will _not_ be executed if thread 2 is cancelled 
  cout << "\n## thread2 cleanup function"<<endl;
}


....



_________________________________________________
Peter Christ
Max-Planck-Institut für Physik
(Werner-Heisenberg-Institut)
email: christ@mppmu.mpg.de
_________________________________________________



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:02 MET