【问题标题】:Connecting Qt GUI with TCL application将 Qt GUI 与 TCL 应用程序连接起来
【发布时间】:2014-05-27 11:23:21
【问题描述】:

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

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

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

我该如何进行这种交流?

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

【问题讨论】:

    标签: c++ qt user-interface tcl


    【解决方案1】:

    在 Tcl 应用程序的 localhost 接口上创建一个网络套接字,并监听来自 Qt 应用程序的命令(参见socketfileeventinfo complete)。我建议您处理从解释器 (interp create) 中接收到的命令,以便您可以轻松地对远程应用程序允许的命令进行沙箱处理。要将字符串传递给 Tcl 应用程序,您的 Qt 应用程序可以只发送到套接字。要接收数据,请发送请求该数据的命令并读取响应。如果您确保仅在 localhost 接口上打开侦听套接字,则可以消除大多数安全问题。如果遇到问题或安排读取命名管道,您可以考虑添加 tls。有很多可能的进程间通信可能性,但通常套接字是最灵活的。

    【讨论】:

    • 在我运行 tcl 解释器的 C++ 应用程序中,我构建了一个复杂的数据结构。由于我和 QT 应用程序编写者知道这个数据结构是什么,我想将指向该数据结构的指针发送给他,这样他就可以查看数据结构并在 GUI 上显示它。因此我需要它们在同一个进程(不同的线程)上运行,以便它们可以共享相同的内存。
    【解决方案2】:

    如果您要捕获 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)结果消息/数据和键/值字典描述了额外的“有趣”的东西,比如在出现错误时的堆栈跟踪。

    【讨论】:

    • 感谢您的回复。请参阅我对 patthoyts 回复的评论。如果您有任何建议,我会很高兴听到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多