【Qt】windows下檢測是否連接外網

這裏通過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);

省略號後是要實現的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章