Управление передачей программы C в графический интерфейс TCL / Tk - Как запустить код при закрытии приложения?

У меня есть проблема, на которую я не могу найти ответ, но я готов поспорить, что она, вероятно, довольно проста для тех, кто раньше работал с такой настройкой приложений.

Я работаю с приложением, которое написано на C, но вызывает графический интерфейс TCL/TK, чтобы делать много приятных вещей на экране. Однако из-за того, как работает 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, который запускается, когда он выключается, а затем сказать, чтобы запустить мою функцию разрыва перед выходом.

Кто-нибудь знает, как или где это сделать?


c tcl tk
person Namey    schedule 28.04.2011    source источник
comment
Боже, я не знаю. Если вы ДОЛЖНЫ всегда запускать блок finally после того, как TCL активировался для обработки, возможно, вам нужно будет разветвить и ждать в своем основном... дочерний процесс может затем перейти в интерпретатор TCL, а родительский процесс может подождать, пока это сделано, и уборка после этого. Это грязно, но я не могу найти в документации TCL ничего, что позволяло бы вам делать то, что вам нужно.   -  person corlettk    schedule 28.04.2011


Ответы (2)


На самом деле есть несколько способов сделать это:

  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

person schlenk    schedule 28.04.2011
comment
Потрясающе, это определенно должно помочь. Спасибо любезно. - person Namey; 04.05.2011

Вы можете попробовать использовать atexit(). Вы передаете ему функцию void (*f)(void), которая будет вызываться при завершении процесса. Я не уверен, насколько хорошо это работает под Windows.

Более похожим на Tcl/Tk подходом было бы использование Tcl_CreateExitHandler для регистрации обработчика выхода:

Tcl_CreateExitHandler организует вызов proc с помощью Tcl_Exit перед завершением приложения. Это обеспечивает ловушку для операций очистки, таких как очистка буферов и освобождение глобальной памяти.

person mu is too short    schedule 28.04.2011