Hi rooters,
seems to me that TCanvas::Emit(“Closed”)
is called twice. (root 6.12.04 and earlier)
Attached a little macro:
.L mycanvas.C+
MyCanvas *mc = new MyCanvas()
then close canvas with WM cross.
Same happens if the canvas is deleted from the command line.
Cheers
Otto
mycanvas.C (1.1 KB)
run-in in debug I see that
MyCanvas::CanvasClosed()
is called twice from:
- void TCanvas::Closed()
- void TPad::Close(Option_t *)
Hi,
in TPad::Close(Option_t *) line: 985 we have:
// emit signal
if (IsA() != TCanvas::Class())
Closed();
so in this case (TCanvas) the signal should be suppressed.
Otto
But it seems that’s what this code does: in case the object is a TCanvas, Closed() is not called … right ?
in TPad::Close(Option_t *) line: 985 we have:
// emit signal
if (IsA() != TCanvas::Class()) Closed();
The conditional statement is ineffective in this case. TPad::Close is called from the TPad destructor which is called as a base destructor from the TCanvas destructror. By the time the TPad destructor starts, the object has (on some platform) ‘forgotten’ that it once was a TCanvas.
ok, I understand.
The question is:
Do we need the Emit(“Closed”) in TCanvas.cxx:802 at all
if it is emitted in TPad anyway.
I use for the moment a workaround:
When I receive “Closed” I do a Disconnect(“Closed”…
then I dont see another one.
Otto
Hi Otto,
Hard to tell if deleting it will generate side effects or not. It seems it was introduced 13 years ago by this patch.