C 程序将控制权交给 TCL/Tk GUI - 如何在关闭应用程序时运行代码?

标签 c tcl tk-toolkit

我有一个问题,我似乎找不到答案,但我愿意打赌,对于以前使用过此类应用程序设置的任何人来说,这可能是一个非常简单的问题。

我正在使用一个用 C 编写的应用程序,但调用 TCL/TK gui 在屏幕上做很多漂亮的事情。然而,由于 TCL/TK 从 C 运行时的工作方式,一旦您移交了控制权,您就永远无法收回它(即 TCL/TK 解释器处理应用程序退出,而不是返回到原始 main()函数)。

基本上,有一些这样的代码:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int  nCmdShow){  
    Tk_Main(1,argv,Tcl_AppInit);  // Tcl_AppInit is a function that runs at the start
    // All code after this point will never, ever run  
    return 0;                     // This return never actually occurs  
}

这会导致一个小问题。我希望能够在程序退出之前销毁数据结构、关闭文件、检查内存泄漏以及执行其他必要的操作。但是,在 Tk_Main 之后我无法执行此操作。我必须找出 TCL/TK 解释器关闭时运行的钩子(Hook),然后告诉它在退出之前运行我的拆卸函数。

有人知道如何或在哪里执行此操作吗?

最佳答案

实际上有几种方法可以做到这一点:

  1. 不要使用 Tk_Main(),而是编写自己的不调用嵌入版本 完成后 Tcl_Exit()。起始代码可以在 generic/tkMain.c 中找到 Tk 来源。
  2. 使用 Tcl_SetExitProc() 注册您自己的退出处理程序,该处理程序将被调用,而不是 exit(), 允许您将控制权返回给您的程序。
  3. 使用 Tcl_CreateExitHandler() 在执行之前仅注册一些清理回调 Tcl_Finalize() 发生,但无论如何都会退出该进程。

处理您的情况的首选方法可能是 2。Tcl_Exit() 的联机帮助页包含您需要的所有详细信息:http://www.tcl.tk/man/tcl8.5/TclLib/Exit.htm

关于C 程序将控制权交给 TCL/Tk GUI - 如何在关闭应用程序时运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5813697/

相关文章:

从符号大小转换为二进制补码

linux - Multixterm - "can' t 找到包 Expect”

python - 如何从 tkinter 中的单选按钮获取值?

c++ - 我如何才能确定 Tcl_Obj 是否是某种 ttk::entity,例如 ttk:entry?

c - do..while 循环 - 当条件满足时不中断

c - 为什么第 33791 个素数 (399137) 会导致 Segmentation Fault?

tcl - 我可以使用 uplevel/upvar 而不必使用 global 吗?

python - Tkinter 在 python 3.6 : TclError: NULL main Window 中给出以下错误

c - 如何在 C 中将 UTC 时间转换为本地时间?

tcl - TCL中如何保持命令安静?