2012-05-19 3 views
0

Наше приложение имеет встроенный в него tcl и с использованием starkit; tk статически связан с ним.встроенный Tk - зависает на ctrl + d

Когда я запускаю приложение, появляется gui и отвечает на все клавиши, но когда я ударил ctrl+d, чтобы завершить его зависание. Я дал задний след повесить в конце сообщения.

Прежде всего позвольте мне описать, как мы встраиваем Tcl/Tk в наше приложение.

#-------------------------------------------------------------- 
# (*) install ActiveTcl 
# we need starkit and ActiveTcl tclsh is batteries included 
#-------------------------------------------------------------- 
% tar -xzf ActiveTcl8.5.8.1.291945-linux-x86_64-threaded.tar.gz 
% cd ActiveTcl8.5.8.1.291945-linux-x86_64-threaded 
# specify /a/b/tcltk8.5.8/linux26_x86_64 as install dir in gui 
% ./install.sh 

Нам нужно tk без истинных шрифтов типа, так как это было crashing приложение. Для того, чтобы установить tk из источников, мы должны tcl компилируется: (. Я не знаю, как собрать tk с --with-tcl указывая на Актив-Tcl каталог Если есть возможность, пожалуйста, дайте мне знать)

#-------------------------------------------------------------- 
# (*) install tcl from sources 
#-------------------------------------------------------------- 
% tar -xzf tcl8.5.8-src.tar.gz 
% cd tcl8.5.8/unix 
% ./configure --prefix=/a/b/tcltk8.5.8/linux26_x86_64 \ 
       --enable-shared=no \ 
       --enable-threads 
% gmake 

NO gmake install для этого tcl так как нам нужно сохранить tclsh ActiveTcl. Затем установите tk.

#-------------------------------------------------------------- 
# (*) install tk from sources 
# need to disable xft (true type font) set --disable-xft 
#-------------------------------------------------------------- 
% tar -xzf tk8.5.8-src.tar.gz 
% cd tk8.5.8/unix 
% ./configure --prefix=/a/b/tcltk8.5.8/linux26_x86_64 \ 
       --enable-shared=no \ 
       --with-tcl=/a/b/tcltk8.5.8/src/tcl8.5.8/unix \ 
       --disable-xft \ 
       --enable-threads 
% gmake 
% gmake install 

Теперь я бег моего приложения с помощью gdb:

% gdb rs 
% r -gui 

Я ударил ctrl+d, который вызывает висит, и это дает следующий задний след. Может ли кто-нибудь помочь мне исправить эту проблему?

Program received signal SIGINT, Interrupt. 
[Switching to Thread 182897358720 (LWP 9535)] 
0x0000003739608b3a in [email protected]@GLIBC_2.3.2() 
    from /lib64/tls/libpthread.so.0 
(gdb) bt 
#0 0x0000003739608b3a in [email protected]@GLIBC_2.3.2() 
    from /lib64/tls/libpthread.so.0 
#1 0x0000000001833e22 in Tcl_ConditionWait() 
#2 0x0000000001834d41 in Tcl_WaitForEvent() 
#3 0x00000000017fec68 in Tcl_DoOneEvent() 
#4 0x00000000017cb4ad in Tcl_VwaitObjCmd() 
#5 0x000000000178b6ec in TclEvalObjvInternal() 
#6 0x00000000017cd08d in TclExecuteByteCode() 
#7 0x00000000017d5798 in TclCompEvalObj() 
#8 0x000000000178d6ac in TclEvalObjEx() 
#9 0x00000000017939c4 in Tcl_CatchObjCmd() 
#10 0x000000000178b6ec in TclEvalObjvInternal() 
#11 0x00000000017cd08d in TclExecuteByteCode() 
#12 0x00000000017d5a84 in Tcl_ExprObj() 
#13 0x000000000178c3e3 in Tcl_ExprBooleanObj() 
#14 0x0000000001796704 in Tcl_IfObjCmd() 
#15 0x000000000178b6ec in TclEvalObjvInternal() 
#16 0x000000000178cee6 in TclEvalEx() 
#17 0x000000000178d616 in Tcl_EvalEx() 
#18 0x00000000017f1be9 in Tcl_FSEvalFileEx() 
#19 0x000000000179c385 in Tcl_SourceObjCmd() 
#20 0x000000000178b6ec in TclEvalObjvInternal() 
#21 0x000000000178cee6 in TclEvalEx() 
---Type <return> to continue, or q <return> to quit--- 
#22 0x000000000178d616 in Tcl_EvalEx() 
#23 0x000000000178d9d8 in TclEvalObjEx() 
#24 0x000000000180d45f in Tcl_UplevelObjCmd() 
#25 0x000000000178b6ec in TclEvalObjvInternal() 
#26 0x00000000017cd08d in TclExecuteByteCode() 
#27 0x000000000180e4cd in TclObjInterpProcCore() 
#28 0x000000000178b6ec in TclEvalObjvInternal() 
#29 0x000000000178cee6 in TclEvalEx() 
#30 0x000000000178d616 in Tcl_EvalEx() 
#31 0x000000000178dacd in Tcl_Eval() 
#32 0x00000000008f26aa in xrAppPlatformInit (interp=0x211a410) 
    at xrAppPlatform.c:430 
#33 0x00000000017f69ca in Tcl_Main() 
#34 0x00000000008f2153 in xrMain (argc=3, argv=0x20fe880) 
    at xrAppPlatform.c:177 
#35 0x00000000008f1092 in main (argc=2, argv=0x7fbfffe718) at main.cpp:213 

ответ

4

Ну, Ctrl + D интерпретируется терминалом как индикатор EOF, а это означает, что канал stdin (на уровне Tcl) теперь будет в состоянии EOF. Тогда возникает вопрос, как ваш код будет реагировать на это. Трудно сказать что-то общее, поскольку вы можете написать код Tcl, чтобы полностью настроить такие вещи.

Однако я вижу (из вашей трассировки стека), что у вас есть vwait (т. Е. Настраиваемый цикл событий). Я предполагаю, что проблема заключается в том, что ваш код не реагирует на EOF правильно и либо использует exit, либо вызывает останов цикла. Чтобы обнаружить это, вам необходимо установить читаемый fileevent по адресу stdin, который пытается прочитать с этого канала (пока это так нормально); если сбой чтения, проверьте для EOF eof и предпримите соответствующие действия ...

Смежные вопросы