這裏通過ping百度的網址進行判斷是否連接外網
使用ping的命令:
ping www.baidu.com -n 2 -w 1000
其中-n 表示要發送的請求數,-w 表示等待每次回覆的超時時間(毫秒)
用法:
bool checkPublicNet()
{
QString networkCmd = "ping www.baidu.com -n 2 -w 500";
QProcess process;
process.start(networkCmd);
process.waitForFinished();
QString result = process.readAll();
if(result.contains("TTL=")){
return true;
}
else{
return false;
}
}
ping通返回會包含“TTL”,這個用法會阻塞主線程,如果要用非阻塞的方式需放在線程中執行
qt的線程有多種方式實現,下面使用QtConcurrent搭配QFuture實現
QFuture<bool> checkLocalNet()
{
QString networkCmd = QString("ping www.baidu.com -n 2 -w 1000");
auto check = [=]{
QProcess process;
process.start(networkCmd);
process.waitForFinished();
QString result = process.readAll();
if(result.contains("TTL=")){
return true;
}
else{
return false;
}
};
//放在線程中,防止界面卡住
QFuture<bool> future= QtConcurrent::run(check);
return future;
}
運用:
QFuture<bool> future = checkLocalNet();
QFutureWatcher<void> *watcher = new QFutureWatcher<void>(this);
connect(watcher, &QFutureWatcher<void>::finished,[=]{
if(future.result()){
...
}
});
watcher->setFuture(future);
省略號後是要實現的內容