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

将控制权交给TCL/Tk GUI的C程序-如何在关闭应用程序时运行代码?,c,tcl,tk,C,Tcl,Tk,我有一个似乎找不到答案的问题,但我敢打赌,对于以前使用过这种应用程序设置的人来说,这可能是一个非常简单的问题 我正在使用一个用C编写的应用程序,但是调用了一个TCL/TK gui来在屏幕上做很多漂亮的事情。然而,由于TCL/TK在从C运行时的工作方式,一旦您移交了控制权,您就再也无法获得它(即TCL/TK解释器处理应用程序退出,而不是返回到原始的main()函数) 基本上,有一些代码是这样的: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE h

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

我正在使用一个用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  
}
这引起了一个小问题。我希望能够在程序退出之前销毁数据结构、关闭文件、检查内存泄漏以及执行其他必要的操作。然而,我不能在蒂克曼之后做。我必须找出TCL/TK解释器中关闭时运行的钩子,然后告诉它在退出之前运行我的teardown函数

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

您可以尝试使用。您向它传递一个
void(*f)(void)
函数,该函数将在进程终止时调用。不过,我不确定在Windows下它的工作情况如何

一种更为Tcl/Tk-ish的方法将用于注册出口处理程序:

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


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

  • 不要使用Tk_Main(),而是编写自己的嵌入版本,该版本不调用 完成后,Tcl_退出()。要从中开始的代码可以在中的generic/tkMain.c中找到 传统知识来源
  • 使用Tcl_SetExitProc()注册您自己的被调用的退出处理程序,而不是exit(), 允许您将控制权返回到程序
  • 使用Tcl_CreateExitHandler()在 Tcl_Finalize()发生,但仍要退出该过程

  • 处理您的案件的首选方法可能是2。Tcl_Exit()的手册页包含您需要的所有详细信息:

    天哪,我不知道。如果您必须在TCL兴奋地处理之后始终运行“最终块”,那么您可能需要在主程序中分叉并等待。。。然后,“子”进程可以“跳转”到TCL解释器中,“父”进程可以等到它完成后再进行清理。它很凌乱,但我在TCL doco中找不到任何可以让你做你需要的事情的东西。太棒了,这绝对可以做到。谢谢。