Для этого потребуется немного больше работы. Вам нужно рассматривать QProcess как IODevice, прислушиваясь к его сигналу readyRead(), когда вся информация доступна из него.
Вот полный код, чтобы сделать то, что вы хотите:
Pinger.h
#ifndef PINGER_H
#define PINGER_H
#include <QtCore/QTimer>
#include <QtCore/QProcess>
/// \brief Starts pinging a specified url constantly
/// As soon as ping fails, it emits a 'pingFailed'
/// signal
class Pinger : public QObject
{
Q_OBJECT
public:
Pinger();
~Pinger();
/// \brief Starts a ping check in a loop
/// \param[in] urlToPing The url that needs to be pinged continuously
/// \param[in] pingInterval Interval (in seconds) at which specified url must be pinged
void startPingCheck(const QString& urlToPing, const int& pingIntervalInSecs = 5);
signals:
/// \brief Signal emitted when pinging of specified url fails
void pingFailed();
private slots:
/// \brief Slot called periodically to ping specified url
void _pingExec();
/// \brief Slot called when ping process returns a message
void _handleProcessMessage();
private:
/// \brief Timer used to ping repeatedly
QTimer _pingTimer;
/// \brief Ping process
QProcess _pingProcess;
/// \brief Pinged url
QString _pingUrl;
};
#endif // PINGER_H
Pinger.cpp
#include <QtCore/QDebug>
#include "pinger.h"
Pinger::Pinger():
_pingUrl("8.8.8.8")
{
}
Pinger::~Pinger()
{
}
void Pinger::startPingCheck(const QString& urlToPing, const int& pingInterval)
{
_pingUrl = urlToPing;
// Listen for messages from the ping process
connect(&_pingProcess, SIGNAL(readyRead()), this, SLOT(_handleProcessMessage()));
// Connect the timer to the exec method that actually calls the ping process
_pingTimer.setInterval(pingInterval * 1000);
_pingTimer.setSingleShot(false);
connect(&_pingTimer, SIGNAL(timeout()), this, SLOT(_pingExec()));
_pingTimer.start();
}
void Pinger::_pingExec()
{
QStringList arguments;
arguments << "-n" << "1" << _pingUrl;
_pingProcess.start("ping", arguments);
}
void Pinger::_handleProcessMessage()
{
QByteArray response = _pingProcess.readAll();
QString responseStr(response);
if(responseStr.contains("100% loss"))
{
qDebug() << "Ping failed. " << _pingUrl << " down.";
emit pingFailed();
}
}
Для какой ОС вам это нужно? – vahancho
Я пишу свое маленькое приложение для NT, особенно в \ for windows7 x32 ultimate – user3780183