我有一个Qt GUI和另一个使用TCL解释器与用户通信的应用程序。
我希望Qt和应用程序共享在应用程序中创建的信息并显示在GUI中。这就是为什么我需要它们成为相同进程的线程(在它们之间共享一个指针)。
另外,我希望Qt生成将通过控制台发送到另一个线程中的TCL(应用程序)的字符串。
我该怎么做这种沟通?
我的想法是将TCL解释器stdin
更改为Qt控制台的stdout
,但我不知道该怎么做!
答案 0 :(得分:0)
在Tcl应用程序的localhost接口上创建网络套接字,并从Qt应用程序中侦听命令(请参阅socket
,fileevent
和info complete
)。我建议您处理从属解释器(interp create
)中收到的命令,以便您可以轻松地对远程应用程序允许的命令进行沙盒处理。要将字符串传递给Tcl应用程序,您的Qt应用程序只能发送到套接字。要接收数据,请发送请求该数据的命令并读取响应。如果确保只打开localhost接口上的侦听套接字,则可以消除大多数安全问题。如果遇到问题或安排读取命名管道,您可以考虑添加tls。有许多可能的进程间通信可能性,但通常套接字是最灵活的。
答案 1 :(得分:0)
如果你要捕获Tcl解释器的标准输出(和标准错误;一些重要的消息去那里!)那么你必须在子进程中运行Tcl解释器,与外部基于Qt / C ++的流程通过管道。 (你应该能够通过搜索Stack Overflow来找到如何做到这一点......)
特定于Tcl的详细信息:您确实希望确保Tcl解释器能够:
fconfigure stdout -buffering line
这是因为在非交互模式下(例如在管道上使用时),Tcl对其标准输出使用完全缓冲。您希望行缓冲(或者对于无缓冲输出可能none
),以便您可以在写出时立即查看值。
您可能还想运行自定义REPL(假设为Tcl 8.5或8.6):
fconfigure stdout -buffering line
while {[gets stdin line] >= 0} {
set code [catch $line msg opt]
puts [list $code $msg $opt]
}
将结果写回的方式是作为Tcl列表(通常不太难解析),其中包含结果代码(通常为0表示OK或1表示ERROR)结果消息/数据,以及键/值字典它描述了其他“有趣”的东西,比如错误情况下的堆栈跟踪。