在TCL中运行外部程序

时间:2018-08-17 19:20:14

标签: events tcl

在根据Gabriel Taubin的平滑而没有形状收缩的情况下开发出详尽的TCL代码以进行平滑之后,该代码运行非常慢。这可能是由于我正在平滑的非结构化网格的大小。我必须使用TCL,因为我使用的网格生成器是Pointwise,而Pointwise的“宏语言”是基于TCL的。我对此还有些陌生,但是有一种方法可以从TCL运行外部代码,其中TCL将数据发送到软件,软件运行平滑操作,然后将输出发送回TCL以更新内部数据在Pointwise网格生成工具中?我将用另一种更快的语言来编写平滑工具。

2 个答案:

答案 0 :(得分:1)

有许多选项可以处理“极其出色地运行”的代码。我将从确定它必须运行多快开始。我们在说毫秒,秒,分钟,小时或天。接下来,必须确定哪个部分较慢。 time命令在这里很有用。

但是假设您已经确定需要更多的性能,并且您对当前程序有一些衡量标准,那么您将知道自己是否正在改进,请尝试以下操作:

  1. 尝试改进现有代码。如果使用的是expr命令,请确保将表达式作为大括号内的单个参数提供给该命令。初学者有时会忘记这一点,并且改进可能会很大。
  2. 使用critcl程序包在“ C”中编码程序的某些部分。 Critcl允许您将“ C”代码直接放入Tcl程序中,并将该代码取出,编译并加载到您的程序中。
  3. 编写传统的基于“ C”的Tcl扩展。 Tcl是非常可扩展的,并且具有用于构建扩展的干净API。有扩展的示例代码,许多扩展的源代码随时可用。
  4. 编写一个程序来完成工作中耗时的部分,并将其作为一个单独的过程执行,并将输出返回到Tcl脚本中。这是exec命令有用的地方。大概您将不得不将数据写出到程序可以获取的位置,并将程序的输出读回到Tcl脚本中。如果想花哨的话,可以通过localhost TCP端口进行双向通信。在Tcl中的设置非常简单。用于执行此操作的程序中的“ C”代码较为繁琐,但Internet上存在许多示例。

选择哪个选项在很大程度上取决于需要多少改进以及必须改进的代码量。您对我们的情况不太了解,所以我只能提供模糊的一般解决方案。

答案 1 :(得分:0)

对于可加载模块,您可以编写Tcl扩展名。一个例子在这里:

File Last Modified Time with Milliseconds Precision

或者,只需编写程序以从文件中获取输入即可。让Tcl将输入数据写入文件,运行程序,然后从外部程序收集输出。