QT ping网络通断

其中 -n 为请求数,-w 为请求超时时间。为了更快获取网络状态结果,调整这两个参数即可。例如:

ping www.baidu.com -n 2 -w 500
  • 1

其含义为向www.baidu.com请求两包数据,每包数据超时时间为500ms。系统调用这个命令,就能在1s内获取网络状态了。但是如果在主线程中直接调用该指令,会存在阻塞,导致界面卡顿。所以,建议通过线程来调用ping指令。
如下为示例,供参考, 
networkThread.h

复制代码
#ifndef NETWORKTHREAD_H
#define NETWORKTHREAD_H
 
#include <QProcess>
#include <QThread>
class networkThread: public QThread
{
    Q_OBJECT            //一定要加这个
public:
    networkThread();
    virtual void run();
    void stop();
signals:
    void signalsNetwork_States(bool state);
 
private:
    bool flagRunning;   //线程运行标志
    QProcess *network_process;
};
 
#endif // NETWORKTHREAD_H
复制代码
复制代码
#include "networkThread.h"
 
networkThread::networkThread()
{
    flagRunning = true;
}
 
void networkThread::run()
{
    QString network_cmd = "ping www.baidu.com -n 2 -w 500";
    QString result;
    network_process = new QProcess();    //不要加this
    while(flagRunning)
    {
        network_process->start(network_cmd);   //调用ping 指令
        network_process->waitForFinished();    //等待指令执行完毕
        result = network_process->readAll();   //获取指令执行结果
        if(result.contains(QString("TTL=")))   //若包含TTL=字符串则认为网络在线
        {
            emit signalsNetwork_States(1);  //在线
        }
        else
        {
            emit signalsNetwork_States(0); //离线
        }
        sleep(1);  //加sleep降低CPU占用率
    }
}
void networkThread::stop()
{
    flagRunning = false;
}
复制代码
复制代码
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include "networkThread.h"    //包含头文件
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
public slots:
    void slot_updateNetwork(bool state); //更新网络状态
 
private:
    Ui::Widget *ui;
    networkThread *netWork_thread;
};
 
#endif // WIDGET_H
复制代码

 

widget.cpp

复制代码
#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    netWork_thread= new networkThread();
    connect(netWork_thread, SIGNAL(signalsNetwork_States(bool)), this, SLOT(slot_updateNetwork(bool)));
    netWork_thread->start(); //开启网络检测线程
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::slot_updateNetwork(bool state)
{
    if(state)
        ui->label->setText("在线");
    else
        ui->label->setText("离线");
}
复制代码

 

 

posted @   txwtech  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2023-12-05 实例化报错-OpenCvSharp.Internal.NativeMethods”的类型初始值设定项引发异常
点击右上角即可分享
微信分享提示