我正在使用 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下工作。