窗口关闭时未调用TCL析构函数

时间:2018-07-24 13:44:37

标签: tcl destructor exit

我有一个DataDialog类,其中包含一个析构函数,如

destructor {
    puts "DataDialog has been destructed"
    #further code
}

如果我通过X-窗口按钮关闭应用程序,则不会调用该析构函数。如果我在file->close上关闭它,则会调用它。

在顶层,我有以下

wm protocol . WM_DELETE_WINDOW { 
    Exit 0
} 

如何更改此行为以调用所有析构函数(或至少是我的类DataDialog中的一个)?

2 个答案:

答案 0 :(得分:1)

怎么样

wm protocol . WM_DELETE_WINDOW { 
    DataDialog destroy
    Exit 0
}

答案 1 :(得分:1)

如果调用exit(或删除解释器),则Tcl 不能保证调用析构函数。那是因为拆除内存中的所有内容可能会非常昂贵。关键资源通常会在C级注册额外的退出处理程序,以确保正确清理它们,但是在很大程度上,它们是例外。您可能会在共同的基础上使用的唯一通道是通道(在退出时会刷新)。没有任何Tcl级别可以执行此操作。这些处理程序通常在不再安全调用Tcl命令的地方调用。

但是,处理协作窗口关闭的默认行为是有效地向窗口发送<Destroy>消息。这些不是完全可拦截的(窗口窗口会消失),但是您可以bind找出它们的发生时间。不过请注意一个怪癖:顶层窗口还会监听孩子的所有事件(尽管除非直接发送给他们,否则他们不会通过传递<Destroy>而被杀死)。在采取特殊措施之前,请检查%W是否确实指向您认为自己确实在收听的窗口。