作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 tcl 的新手。我想在 tcl 中创建一个线程,它应该在后台继续调用自己。
#!/usr/bin/env tclsh
set serPort [open "/dev/ttyS0" RDWR]
fconfigure $serPort -mode 115200,n,8,1 -blocking 0
while { 1 } {
set data [gets $chan]
puts $data
}
我想避免使用上面的 while 循环,并为 while 循环内的功能创建一个可重复的线程。基本上我将我的 PC 的 COM1 连接到设备并从设备获取串行数据。但是,如果端口上没有数据,即使我使用“eof”命令,它仍然不会跳出循环。这就是我要创建线程的原因。
我打算为此使用 Tcl_CreateThread,但我不明白如何使用它
最佳答案
不要那样做。相反,使用通常的 Tcl 习惯用法来处理非阻塞 channel :为“ channel 可读”事件设置一个处理程序,然后进入事件循环;当设备向您打开的端口发送数据时,操作系统会将数据传递给您的应用程序并调用回调。
演示该概念的最小程序如下所示:
proc my_read_handler ch {
set data [read $ch]
if {[eof $ch]} {
close $ch
set ::forever done ;# this makes the call to `vwait` below to quit
return
}
# Otherwise process the data here ...
}
set serPort [open "/dev/ttyS0" RDWR]
fconfigure $serPort -mode 115200,n,8,1 -blocking no
fileevent $serPort readable [list my_read_handler $serPort]
vwait ::forever ;# the program enters the event loop here
阅读更多相关信息 in the examples .
几个观察结果:
close
,在这种情况下甚至不会调用“可读”。vwait
(此外,强烈建议不要这样做,因为这将重新进入事件循环):你只需打开你的设备,比如说,在用户单击按钮时执行的代码中,在获取的 channel 上设置可读回调,然后在该回调中执行其余处理(如上所示).阅读this (以及那里的链接)以获取有关面向事件编程的更多信息。还有 search wiki — 它包含大量示例和背景知识。
关于tcl - 如何在 tcl 8.4 中创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12197358/
我是一名优秀的程序员,十分优秀!