window 关闭时未调用 TCL 析构函数
TCL Destructor is not called on window close
我有一个 class DataDialog
,其中包含一个像
这样的析构函数
destructor {
puts "DataDialog has been destructed"
#further code
}
如果我通过 X
-window 按钮关闭应用程序,则不会调用此析构函数。如果我关闭它超过 file->close
它被调用。
在顶层我有以下
wm protocol . WM_DELETE_WINDOW {
Exit 0
}
如何更改此行为以调用所有析构函数(或至少是我的 class DataDialog 之一)?
怎么样
wm protocol . WM_DELETE_WINDOW {
DataDialog destroy
Exit 0
}
如果您调用 exit
(或者如果您删除解释器),那么 Tcl 不保证 调用析构函数。那是因为拆除内存中的所有内容的代价可能非常高。关键资源通常在 C 级别注册了额外的退出处理程序,以确保它们得到正确清理,但它们非常例外;您唯一可能经常使用的是通道(在退出时刷新)。没有任何 Tcl-level 可以这样做;这些处理程序通常在调用 Tcl 命令不再安全的地方被调用。
但是,处理合作 window 闭包的默认行为实际上是向 window 发送 <Destroy>
消息。这些不是完全可拦截的(window 将 消失)但您可以 bind
找到它们以了解它们何时发生。不过要注意一个怪癖:顶层 windows 也会监听他们 children 的所有事件(尽管他们不会因为传递 <Destroy>
而被杀死,除非他们被直接发送给他们).在采取特殊行动之前,检查 %W
实际上指的是您认为自己真正在听的 window。
我有一个 class DataDialog
,其中包含一个像
destructor {
puts "DataDialog has been destructed"
#further code
}
如果我通过 X
-window 按钮关闭应用程序,则不会调用此析构函数。如果我关闭它超过 file->close
它被调用。
在顶层我有以下
wm protocol . WM_DELETE_WINDOW {
Exit 0
}
如何更改此行为以调用所有析构函数(或至少是我的 class DataDialog 之一)?
怎么样
wm protocol . WM_DELETE_WINDOW {
DataDialog destroy
Exit 0
}
如果您调用 exit
(或者如果您删除解释器),那么 Tcl 不保证 调用析构函数。那是因为拆除内存中的所有内容的代价可能非常高。关键资源通常在 C 级别注册了额外的退出处理程序,以确保它们得到正确清理,但它们非常例外;您唯一可能经常使用的是通道(在退出时刷新)。没有任何 Tcl-level 可以这样做;这些处理程序通常在调用 Tcl 命令不再安全的地方被调用。
但是,处理合作 window 闭包的默认行为实际上是向 window 发送 <Destroy>
消息。这些不是完全可拦截的(window 将 消失)但您可以 bind
找到它们以了解它们何时发生。不过要注意一个怪癖:顶层 windows 也会监听他们 children 的所有事件(尽管他们不会因为传递 <Destroy>
而被杀死,除非他们被直接发送给他们).在采取特殊行动之前,检查 %W
实际上指的是您认为自己真正在听的 window。