如何解决QProcess 有时会返回空字符串
我最近一直在尝试创建一个函数来扫描我的程序中的无线网络。基本上有一个“扫描”按钮,使用时会触发此功能。
这个函数非常简单,它只是实例化一个 QProcess,它打开一个 shell 并执行以下来自 macOS X 的原生命令:
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s | awk -F\" \" '{ print $1 }
这允许我扫描附近的无线网络并过滤结果以仅显示其 SSID 列表。
出现问题是因为当我使用 Qt 函数时,它会返回正确的 SSID,但在大多数情况下,当我再次按下按钮时,返回的列表是空的。尝试调试应用程序时,我看到 QProcess 命令返回一个空字符串。
来自我的应用程序的代码:
QStringList WifiConnection::scan_macOS()
{
QProcess* myProcess = new QProcess( this );
QString airport = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport";
QString command = " -s | awk -F\" \" '{ print $1 }";
qDebug() << "Opening shell.";
myProcess->start("sh");
qDebug() << "Executing command: " << airport << command;
myProcess->write(airport + command);
myProcess->closeWriteChannel();
myProcess->waitForFinished();
QString info = myProcess->readAllStandardOutput();
}
知道这可能是什么原因吗?是否有任何解决方案可以不获取此空字符串?
编辑:
-
使用的 Qt 版本:5.4.1
-
设备:Mac Book Air (macOS)
解决方法
我发现问题发生是因为 macOS 中的机场管理员已经在忙于其他操作(例如扫描)。
发生这种情况的原因可能有:
- 另一个应用正在控制机场应用。
- 使用 QNetworkConfigurationManager 每 10 秒执行一次自动无线扫描。
- 在您的笔记本电脑中启用了定位功能,这在某些操作系统版本中会导致定期扫描。
为了避免得到空答案,我所做的是按照@markus-nm 在评论中的建议添加 myProcess->waitForFinished();
,并使用 if (!info.isEmpty())
确保结果不为空。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。