【发布时间】:2013-07-19 14:18:56
【问题描述】:
我正在使用 Perl “Tk” 为外部命令(“sox”,如果有帮助的话)编写一个包装器。 当然,我需要异步运行它,以避免阻塞 tk 的 MainLoop()。 但是,我需要阅读它的输出来通知用户命令的进度。
我正在使用 IPC::Open3 测试这样的解决方案:
{
$| = 1;
$pid = open3(gensym, ">&STDERR", \*FH, $cmd) or error("Errore running command \"$cmd\"");
}
while (defined($ch = FH->getc)) {
notifyUser($ch) if ($ch =~ /$re/);
}
waitpid $pid, 0;
$retval = $? >> 8;
POSIX::close($_) for 3 .. 1024; # close all open handles (arbitrary upper bound)
当然,while 循环会阻塞 MainLoop,直到 $cmd 确实终止。
有什么方法可以异步读取输出句柄吗? 还是我应该使用标准叉子? 该解决方案也应该在win32下工作。
【问题讨论】: