Logo ROOT   6.16/01
Reference Guide
draw_mt.cxx File Reference

Detailed Description

This macro demonstrate usage of ROOT7 graphics from many threads Three different canvases in three different threads are started and regularly updated.

Extra thread created in background and used to run http protocol, in/out websocket communications and process http requests Main application thread (CLING interactive session) remains fully functional

/*************************************************************************
* Copyright (C) 1995-2015, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
R__LOAD_LIBRARY(libROOTWebDisplay);
#include "ROOT/RHist.hxx"
#include "ROOT/RCanvas.hxx"
#include "TRandom3.h"
#include "TEnv.h"
#include "TROOT.h"
#include <thread>
using namespace ROOT::Experimental;
void draw_canvas(const std::string &title, RColor col)
{
// Create histograms
RAxisConfig xaxis(100, -10., 10.);
auto pHist = std::make_shared<RH1D>(xaxis);
auto pHist2 = std::make_shared<RH1D>(xaxis);
TRandom3 random;
Float_t px, py;
for (int n = 0; n < 10000; ++n) {
random.Rannor(px, py);
pHist->Fill(px - 2);
pHist2->Fill(py + 2);
}
// Create a canvas to be displayed.
auto canvas = RCanvas::Create(title + " canvas");
canvas->Draw(pHist)->SetLineColor(col);
canvas->Draw(pHist2)->SetLineColor(RColor::kBlue);
int maxloop = 50;
canvas->Show();
printf("%s started\n", title.c_str());
for (int loop = 0; loop < maxloop; ++loop) {
for (int n = 0; n < 10000; ++n) {
random.Rannor(px, py);
pHist->Fill(px - 2);
pHist2->Fill(py + 2);
}
canvas->Modified();
canvas->Update();
canvas->Run(0.5); // let run canvas code for next 0.5 seconds
// if (loop == 0)
// canvas->SaveAs(title + "_first.png");
// if (loop == maxloop - 1)
// canvas->SaveAs(title + "_last.png");
}
printf("%s completed\n", title.c_str());
// remove from global list, will be destroyed with thread exit
canvas->Remove();
}
void draw_mt()
{
gEnv->SetValue("WebGui.HttpThrd", "yes");
gEnv->SetValue("WebGui.SenderThrds", "yes");
std::thread thrd1(draw_canvas, "First", RColor::kRed);
std::thread thrd2(draw_canvas, "Second", RColor::kBlue);
std::thread thrd3(draw_canvas, "Third", RColor::kGreen);
thrd1.join();
thrd2.join();
thrd3.join();
}
float Float_t
Definition: RtypesCore.h:53
#define R__LOAD_LIBRARY(LIBRARY)
Definition: Rtypes.h:471
@ kRed
Definition: Rtypes.h:63
@ kGreen
Definition: Rtypes.h:63
@ kBlue
Definition: Rtypes.h:63
R__EXTERN TEnv * gEnv
Definition: TEnv.h:171
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=0)
Set the value of a resource or create a new resource.
Definition: TEnv.cxx:736
Random number generator class based on M.
Definition: TRandom3.h:27
virtual void Rannor(Float_t &a, Float_t &b)
Return 2 numbers distributed following a gaussian with mean=0 and sigma=1.
Definition: TRandom.cxx:481
const Int_t n
Definition: legend1.C:16
void EnableThreadSafety()
Enables the global mutex to make ROOT thread safe/aware.
Definition: TROOT.cxx:545
Date
2018-08-16
Warning
This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback is welcome!
Author
Sergey Linev

Definition in file draw_mt.cxx.