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

时间:2011-04-28 04:41:05

标签: c tcl tk

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

我正在使用一个用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解释器中的钩子,然后告诉它在退出之前运行我的拆卸功能。

有人知道如何或在何处这样做?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用atexit()。您传递一个void (*f)(void)函数,以便在进程终止时调用。我不确定它在Windows下的效果如何。

更多Tcl / Tk-ish方法是使用Tcl_CreateExitHandler注册退出处理程序:

  

Tcl_CreateExitHandler 安排 Tcl_Exit 在终止应用程序之前调用 proc 。这为清理操作提供了一个钩子,例如刷新缓冲区和释放全局内存。

答案 1 :(得分:1)

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

  1. 不要使用Tk_Main(),而是编写自己的版本用于不调用的嵌入 Tcl_Exit()完成后。开始的代码可以在。的generic / tkMain.c中找到 Tk来源。
  2. 使用Tcl_SetExitProc()注册自己的退出处理程序,而不是exit(), 允许您将控制权返还给您的程序。
  3. 使用Tcl_CreateExitHandler()仅在注册之前注册一些清理回调 Tcl_Finalize()会发生,但无论如何都会退出该过程。
  4. 处理案例的首选方法可能是2. Tcl_Exit()的联机帮助页面包含您应该需要的所有详细信息:http://www.tcl.tk/man/tcl8.5/TclLib/Exit.htm