将Qt GUI与TCL应用程序连接

时间:2014-05-27 11:23:22

标签: c++ qt user-interface tcl

我有一个Qt GUI和另一个使用TCL解释器与用户通信的应用程序。

我希望Qt和应用程序共享在应用程序中创建的信息并显示在GUI中。这就是为什么我需要它们成为相同进程的线程(在它们之间共享一个指针)。

另外,我希望Qt生成将通过控制台发送到另一个线程中的TCL(应用程序)的字符串。

我该怎么做这种沟通?

我的想法是将TCL解释器stdin更改为Qt控制台的stdout,但我不知道该怎么做!

2 个答案:

答案 0 :(得分:0)

在Tcl应用程序的localhost接口上创建网络套接字,并从Qt应用程序中侦听命令(请参阅socketfileeventinfo 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)结果消息/数据,以及键/值字典它描述了其他“有趣”的东西,比如错误情况下的堆栈跟踪。