QProcess 有时会返回空字符串
QProcess sometimes returning empty string
我最近一直在尝试在我的程序中创建一个扫描无线网络的功能。基本上有一个“扫描”按钮,使用时会触发此功能。
这个函数非常简单,它只是实例化一个 QProcess,它打开一个 shell 并执行以下来自 macOS X 的本机命令:
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s | awk -F\" \" '{ print }
这让我可以扫描附近的无线网络并过滤结果以仅显示其 SSID 列表。
出现问题是因为当我使用我的 Qt 函数时,它 returns 给我正确的 SSID,但在大多数情况下,当我再次按下按钮时,返回的列表是空的。尝试调试应用程序时,我看到 QProcess 命令 returns 是一个空字符串。
来自我的应用程序的代码:
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 }";
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 秒执行一次自动无线扫描。
- 您的笔记本电脑启用了定位功能,在某些 OS 版本中会导致定期扫描。
我为避免得到空答案所做的是按照@markus-nm 在评论中的建议添加 myProcess->waitForFinished();
,并确保结果不为空 if (!info.isEmpty())
。
我最近一直在尝试在我的程序中创建一个扫描无线网络的功能。基本上有一个“扫描”按钮,使用时会触发此功能。
这个函数非常简单,它只是实例化一个 QProcess,它打开一个 shell 并执行以下来自 macOS X 的本机命令:
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s | awk -F\" \" '{ print }
这让我可以扫描附近的无线网络并过滤结果以仅显示其 SSID 列表。
出现问题是因为当我使用我的 Qt 函数时,它 returns 给我正确的 SSID,但在大多数情况下,当我再次按下按钮时,返回的列表是空的。尝试调试应用程序时,我看到 QProcess 命令 returns 是一个空字符串。
来自我的应用程序的代码:
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 }";
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 秒执行一次自动无线扫描。
- 您的笔记本电脑启用了定位功能,在某些 OS 版本中会导致定期扫描。
我为避免得到空答案所做的是按照@markus-nm 在评论中的建议添加 myProcess->waitForFinished();
,并确保结果不为空 if (!info.isEmpty())
。