设置报警阀值和监控磁盘,代码如下:
DiskSpaceMonitor.h
#ifndef MONITORDISKSPACETASK_H
#define MONITORDISKSPACETASK_H
#include <QThread>
#include <mutex>
#include <Windows.h>
#define GB (1024*1024*1024)
class DiskSpaceMonitor : public QThread
{
Q_OBJECT
public:
static DiskSpaceMonitor* getInstance()
{
if (m_pDiskSpaceMonitor == nullptr)
{
std::unique_lock<std::mutex> lck (m_mutex);
if (m_pDiskSpaceMonitor == nullptr)
{
m_pDiskSpaceMonitor = new DiskSpaceMonitor;
}
}
return m_pDiskSpaceMonitor;
}
void startThread();
void stopThread();
private:
explicit DiskSpaceMonitor(QObject *parent = 0);
protected:
void run() override;
signals:
void sig_DiskSpaceEnough(bool);
private:
quint64 getDiskFreeSpace(QString iDriver);
signals:
private:
static std::mutex m_mutex;
static DiskSpaceMonitor* m_pDiskSpaceMonitor;
bool m_bStart;
int m_freeSpace;
};
#endif // MONITORDISKSPACETASK_H
DiskSpaceMonitor.cpp
#include "DiskSpaceMonitor.h"
#include <Windows.h>
#include <QDir>
#include <QDebug>
#include <QSettings>
#include <QFileInfo>
#include <QFileInfoList>
#include <QCoreApplication>
std::mutex DiskSpaceMonitor::m_mutex;
DiskSpaceMonitor* DiskSpaceMonitor::m_pDiskSpaceMonitor = nullptr;
DiskSpaceMonitor::DiskSpaceMonitor(QObject *parent) : QThread(parent),
m_bStart(false)
{
m_freeSpace = 50;//设定剩余空间阈值,单位G
}
void DiskSpaceMonitor::run()
{
while(m_bStart)
{
QString path = "E:\Test";//设置被监控磁盘
QFileInfo fileInfo(path);
QString strDiskName = fileInfo.absolutePath();
qint64 nFreeSpace = getDiskFreeSpace(strDiskName);
bool bEnough = false;
if( nFreeSpace > m_freeSpace )
{
bEnough = true;
}
else
{
bEnough = false;
}
emit sig_DiskSpaceEnough(bEnough);//发送信号待处理,false时空间低于阈值
sleep(60);//每1分钟检测一次
}
}
quint64 DiskSpaceMonitor::getDiskFreeSpace(QString iDriver)
{
LPCWSTR strDriver = (LPCWSTR)iDriver.utf16();
ULARGE_INTEGER freeDiskSpaceAvailable, totalDiskSpace, totalFreeDiskSpace;
//调用函数获取磁盘参数(单位为字节Byte),转化为GB,需要除以(1024*1024*1024)
GetDiskFreeSpaceExW( strDriver, &freeDiskSpaceAvailable, &totalDiskSpace, &totalFreeDiskSpace) ;
qDebug() << "total space is:" << (quint64)totalDiskSpace.QuadPart/(1024*1024*1024);
qDebug() << "free space is:" << (quint64)totalFreeDiskSpace.QuadPart/(1024*1024*1024);
return (quint64)totalFreeDiskSpace.QuadPart/GB;
}
void DiskSpaceMonitor::startThread()
{
m_bStart = true;
this->start();
}
void DiskSpaceMonitor::stopThread()
{
m_bStart = false;
}
#include "testwgt.h"
#include <QApplication>
#include "DiskSpaceMonitor.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DiskSpaceMonitor::getInstance()->startThread();
return a.exec();
}