C++/QT 获取系统CPU、内存、磁盘、进程相关信息

2023-11-08

       最近在学习用C++获取WINDOWS和LINUX  下的系统信息,对其大概方法做了一些总结,希望对新人有一些帮助,话不多说,先来代码大笑大笑。。。。。。。。。。。。。。。。。。。

      首先,我针对两个平台定义了一个接口类,即纯虚函数类,其windows 和 linux 的实现类可以实现该类,接口代码如下:

#pragma once
#pragma comment(lib,"Kernel32.lib")
#pragma comment(lib,"Psapi.lib")
#include <Windows.h>
#include <TlHelp32.h>
#include<direct.h>
#include<winternl.h>
#include <Psapi.h>
#include <QMap>
//获取系统信息的接口
class ISysInfo
{
public:
	virtual ~ISysInfo(){}
	/************************************************************************/
	/*函数说明:获取系统CPU当前使用率
	/*函数参数:nCpuRate->CPU使用率
	/*返回结果:返回结果状态
	/*作者时间:Bevis 2014-07-19
	/************************************************************************/
	virtual bool GetSysCpu(int& nCpuRate) = 0;
	/************************************************************************/
	/*函数说明:获取系统内存信息
	/*函数参数:nMemTotal->内存总共大小,(MB);nMemUsed->内存已使用大小,(MB)
	/*返回结果:返回结果状态
	/*作者时间:Bevis 2014-07-19
	/************************************************************************/
	virtual bool GetSysMemory(int& nMemTotal,int& nMemUsed) = 0;
	/************************************************************************/
	/*函数说明:获取系统磁盘信息
	/*函数参数:nDiskTotal->磁盘总共大小,(MB);nDiskUsed->磁盘已使用大小,(MB)
	/*返回结果:返回结果状态
	/*作者时间:Bevis 2014-07-19
	/************************************************************************/
	virtual bool GetSysDisk(int& nDiskTotal,int& nDiskUsed) = 0;
	/************************************************************************/
	/*函数说明:遍历系统所有进程
	/*函数参数:无
	/*返回结果:进程PID和进程名称的映射集合
	/*作者时间:Bevis 2014-07-19
	/************************************************************************/
	virtual QMap<int,QString> GetAllProcess() = 0;
	/************************************************************************/
	/*函数说明:获取单个进程的内存使用率
	/*函数参数:nPid->进程唯一标识号;nProcessMemRate->进程的内存使用率
	/*返回结果:返回结果状态
	/*作者时间:Bevis 2014-07-19
	/************************************************************************/
	virtual bool GetProcessMemory(int nPid,int& nProcessMemRate) = 0;
};

由于时间有限,暂时只实现了WINDOWS平台,后续我会补上LINUX的实现....微笑微笑微笑

windows的实现类头文件定义如下:

#pragma once
#include <QDebug>
#include <QString>
#include "ISysInfo.h"
#include <atlconv.h>
#include <string.h>

//在WINDOWS平台上实现
class ISysWin: public ISysInfo
{
public:
	ISysWin(void);
	virtual ~ISysWin(void);

	bool GetSysCpu(int& nCpuRate) ;

	bool GetSysMemory(int& nMemTotal,int& nMemUsed);

	bool GetSysDisk(int& nDiskTotal,int& nDiskUsed) ;

	QMap<int,QString> GetAllProcess() ;

	bool GetProcessMemory(int nPid,int& nProcessMemRate) ;

protected:
	//时间转换
	__int64 Filetime2Int64(const FILETIME* ftime);
	//两个时间相减运算
	__int64 CompareFileTime(FILETIME preTime,FILETIME nowTime);
};

windows的实现类cpp文件定义如下:

#include "ISysWin.h"


ISysWin::ISysWin(void)
{
}


ISysWin::~ISysWin(void)
{
}

__int64 ISysWin::Filetime2Int64(const FILETIME* ftime)
{
	LARGE_INTEGER li;
	li.LowPart = ftime->dwLowDateTime;
	li.HighPart = ftime->dwHighDateTime;
	return li.QuadPart;
}

__int64 ISysWin::CompareFileTime(FILETIME preTime,FILETIME nowTime)
{
	return this->Filetime2Int64(&nowTime) - this->Filetime2Int64(&preTime);
}

//将单字节char*转化为宽字节wchar_t*  
wchar_t* AnsiToUnicode( const char* szStr )  
{  
	int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );  
	if (nLen == 0)  
	{  
		return NULL;  
	}  
	wchar_t* pResult = new wchar_t[nLen];  
	MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );  
	return pResult;  
}  

//将宽字节wchar_t*转化为单字节char*  
inline char* UnicodeToAnsi( const wchar_t* szStr )  
{  
	int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );  
	if (nLen == 0)  
	{  
		return NULL;  
	}  
	char* pResult = new char[nLen];  
	WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );  
	return pResult;  
}  

bool ISysWin::GetSysCpu(int& nCpuRate) 
{
	HANDLE hEvent;
	bool res;
	static FILETIME preIdleTime;
	static FILETIME preKernelTime;
	static FILETIME preUserTime;

	FILETIME idleTime;
	FILETIME kernelTime;
	FILETIME userTime;

	res = GetSystemTimes(&idleTime,&kernelTime,&userTime);

	preIdleTime = idleTime;
	preKernelTime = kernelTime;
	preUserTime = userTime;

	hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//初始值为nonsignaled

	WaitForSingleObject(hEvent,500);//等待500毫秒

	res = GetSystemTimes(&idleTime,&kernelTime,&userTime);

	int idle = CompareFileTime(preIdleTime,idleTime);
	int kernel = CompareFileTime(preKernelTime,kernelTime);
	int user = CompareFileTime(preUserTime,userTime);

	nCpuRate =(int)ceil( 100.0*( kernel + user - idle ) / ( kernel + user ) );

	return res;
}

bool ISysWin::GetSysMemory(int& nMemTotal,int& nMemUsed)
{
	MEMORYSTATUSEX memsStat;
	memsStat.dwLength = sizeof(memsStat);
	if(!GlobalMemoryStatusEx(&memsStat))//如果获取系统内存信息不成功,就直接返回
	{
		nMemTotal = -1;
		nMemUsed  = -1;
		return false;
	}
	int nMemFree = memsStat.ullAvailPhys/( 1024.0*1024.0 );
	nMemTotal = memsStat.ullTotalPhys/( 1024.0*1024.0 );
	nMemUsed= nMemTotal- nMemFree;
	return true;
}

bool ISysWin::GetSysDisk(int& nDiskTotal,int& nDiskUsed) 
{
	static char path[_MAX_PATH];//存储当前系统存在的盘符
	int curdrive = _getdrive();
	unsigned long lFreeAll = 0UL;
	unsigned long lTotalAll = 0UL;
	for(int drive = 1; drive <= 26; drive++ )//遍历所有盘符
	{
		if( !_chdrive( drive ) )
		{
			sprintf(path, "%c:\\", drive + 'A' - 1 );
			ULARGE_INTEGER caller, total, free;
			WCHAR wszClassName[_MAX_PATH];  
			memset(wszClassName,0,sizeof(wszClassName));  
			MultiByteToWideChar(CP_ACP,0,path,strlen(path)+1,wszClassName,  
				sizeof(wszClassName)/sizeof(wszClassName[0]));  
			if (GetDiskFreeSpaceEx(wszClassName, &caller, &total, &free) == 0)
			{
				qDebug()<<"GetDiskFreeSpaceEx Filed!";
				return false;
			}

			double dTepFree = free.QuadPart/( 1024.0*1024.0 );
			double dTepTotal = total.QuadPart/( 1024.0*1024.0 );
			//qDebug()<<"Get Windows Disk Information:"<<path<<"--free:"<<dTepFree<<"--total:"<<dTepTotal;
			lFreeAll += (unsigned long)ceil(dTepFree);
			lTotalAll += (unsigned long)ceil(dTepTotal);
		}
	}
	nDiskUsed = lFreeAll;
	nDiskTotal= lTotalAll;
	return true;
}

QMap<int,QString> ISysWin::GetAllProcess() 
{
	HANDLE hProcessSnap;	//进程快照的句柄
	HANDLE hProcess;	//用于获取进程的句柄
	PROCESSENTRY32 pe32;//进程信息的结构体
	QMap<int,QString> pidMap;//保存所有进程的PID
	// 获取系统进程信息的快照
	hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
	if( hProcessSnap == INVALID_HANDLE_VALUE )
	{
		qDebug()<<"CreateToolhelp32Snapshot Failed!";// 打印错误信息
		if(NULL !=hProcessSnap)
		{
			CloseHandle( hProcessSnap );          // 关闭进程快照信息
			hProcessSnap = NULL;
		}
		return pidMap;
	}
	// 在使用之前设置PROCESSENTRY32结构体的初始大小值,如果不初始化dwSize, Process32First 调用会失败.
	pe32.dwSize = sizeof( PROCESSENTRY32 );
	if( !Process32First( hProcessSnap, &pe32 ) )// 开始获取第一个进程的信息,如果获取失败就返回
	{
		qDebug()<<"Process32First Failed!"; // 打印错误信息
		if(NULL !=hProcessSnap)
		{
			CloseHandle( hProcessSnap );          // 关闭进程快照信息
			hProcessSnap = NULL;
		}
		return pidMap;
	}
	//开始遍历所有进程
	pidMap.clear();
	do
	{
		//加入PID
		if(!pidMap.contains((int)pe32.th32ProcessID))
		{
			QString strProcessName =UnicodeToAnsi(pe32.szExeFile);
			pidMap.insert((int)pe32.th32ProcessID,strProcessName);
		}
		
		//当然还可以获取到很多其他信息,例如进程名字(szExeFile[MAX_PATH])、父进程PPID(th32ParentProcessID)。。。
		/* 附上该结构体信息
		typedef struct tagPROCESSENTRY32 {
		DWORD     dwSize;
		DWORD     cntUsage;
		DWORD     th32ProcessID;
		ULONG_PTR th32DefaultHeapID;
		DWORD     th32ModuleID;
		DWORD     cntThreads;
		DWORD     th32ParentProcessID;
		LONG      pcPriClassBase;
		DWORD     dwFlags;
		TCHAR     szExeFile[MAX_PATH];
		} PROCESSENTRY32, *PPROCESSENTRY32;
		*/
	} 
	while( Process32Next( hProcessSnap, &pe32 ) );// 获取下一个进程的信息
	if(NULL !=hProcessSnap)//最后关闭快照句柄
	{
		CloseHandle( hProcessSnap );
		hProcessSnap = NULL;
	}
	return pidMap;
}

bool ISysWin::GetProcessMemory(int nPid,int& nProcessMemRate) 
{
	HANDLE hProcess;//该线程的句柄
	PROCESS_MEMORY_COUNTERS pmc;//该线程的内存信息结构体
	hProcess = OpenProcess( PROCESS_ALL_ACCESS ,FALSE, nPid );//利用最大权限打开该线程并获得句柄
	if (NULL == hProcess)
	{
		qDebug()<<"OpenProcess Failed!";
		return false;
	}
	if ( !GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
	{
		qDebug()<<"GetProcessMemoryInfo Failed!";
		return false;
	}

	int nMemTotal = 0;
	int nMemUsed = 0;
	this->GetSysMemory(nMemTotal,nMemUsed);
	double tep = ((int)pmc.WorkingSetSize*1.0);
	nProcessMemRate = (int)ceil(100*(tep/(1024.0*1024.0)) / nMemTotal) ;

	CloseHandle(hProcess);

	return true;
}


最后当然是我的测试类了,

#include <QtCore/QCoreApplication>
#include "ISysInfo.h"
#include "ISysWin.h"
#include <Windows.h>
int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	ISysInfo* pISys = new ISysWin();//调用WINDOWS实现的子类
	while (1)
	{
		int nCpuRate = -1;
		int nMemTotal = -1;
		int nMemUsed = -1;
		int nDiskTotal = -1;
		int nDiskUsed = -1;
		int nProcessMemRate = -1;
		QMap<int,QString> pidMap;

		pISys->GetSysCpu(nCpuRate);
		qDebug()<<"CPU Rate:"<<nCpuRate<<"%";

		pISys->GetSysMemory(nMemTotal,nMemUsed);
		qDebug()<<"Mem Total:"<<nMemTotal<<"\t Mem Used:"<<nMemUsed;

		pISys->GetSysDisk(nDiskTotal,nDiskUsed);
		qDebug()<<"Disk Total:"<<(nDiskTotal/1024.0)<<"GB \t Disk Used:"<<(nDiskUsed/1024.0)<<"GB";

		pISys->GetProcessMemory(6472,nProcessMemRate);
		qDebug()<<"PID:6472;\t Mem Rate:"<<nProcessMemRate<<"%";

		pidMap = pISys->GetAllProcess();
		qDebug()<<"Process Number:"<<pidMap.size();

		qDebug()<<"-------------------------------------------------------------------";
		Sleep(1000);
	}	
	delete pISys;
	return a.exec(); 
}<span style="color:#ff0000;">
</span>

后期我会继续实现linux下的代码,请继续关注!!!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++/QT 获取系统CPU、内存、磁盘、进程相关信息 的相关文章

  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • WinSock.h 和 WinSock2.h 使用哪个?

    有谁知道 WinSock h 和 WinSock2 h 之间的区别 我知道它们不使用相同的库 lib 但我不知道 WinSock2 是否仅添加了新功能 或者是否还改进了 WinSock 1 功能 我正在使用 IP TCP 套接字 并希望使用
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0

随机推荐

  • day35 贪心

    860 柠檬水找零 按照客户给的钱进行不同的找钱策略 406 根据身高重建队列 先按照身高进行高到低排序 再按照位次插入即可 452 用最少数量的箭引爆气球 先按照左边界进行排序 判断是否重叠 如果重叠了直接count 如果不重叠更新最小的
  • cargo 中 github 换源

    touch cargo config echo source crates io replace with tuna source tuna registry https mirrors tuna tsinghua edu cn git c
  • CTF安全竞赛介绍

    目录 一 赛事简介 二 CTF方向简介 1 Web Web安全 1 简介 2 涉及主要知识 2 MISC 安全杂项 1 介绍 2 涉及主要知识 3 Crypto 密码学 1 介绍 2 涉及主要知识 4 Reverse 逆向工程 1 介绍 2
  • 封装element-ui中的Drawer(抽屉)

    之前我都不知道有drawer这个方法 平常对于那些弹框我一般习惯用dialog这个组件 然而前几天 我发现 drawer也用起来不错 便想起来 把他封装起来 好复用 下面呢 就直接上代码了
  • linux三个线程输出abc,三个线程循环输出ABC10次

    import java util concurrent locks Lock import java util concurrent locks ReentrantLock public class ABC private static i
  • Java集合中用Collections排序

    Collections简介及常用功能 java util Collections是集合工具类 用来对集合进行操作 部分主要方法如下 public static void reverse List
  • 记录工作中使用easyExcel实现复杂一对多excel表格导出及多sheet页导出

    业务场景 一个工单对应多个项目 一个项目对应多个配件信息 这样形成了三层级联的一对多的业务场景 实现效果如下 功能实现 1 引入maven
  • Visio打开或取消箭头的自动吸附和自动连接

    在用Visio画图时Visio的自动对齐 自动连接 自动吸附功能确实能带了很多便利 但在画连接线时 Visio总是自动连接箭头与图形的固定节点 想要微调一下连接位置 就显得很不方便 需要关闭自动连接功能 这些小设置 用时总是不记得 特记在这
  • 华为Mate60 Pro曝光:麒麟芯片9100 or 骁龙8Gen2+5G,7699元起,你觉得如何?

    最近网上关于华为Mate60系列的爆料逐渐增多 尤其是对于新机到底支不支持5G 众说纷纭 而且老是变动 7月14日 有数码博主爆料称 华为Mate60系列确实分前期和后期版本 前期为了秀肌肉 会展示新的成果 据可靠消息源分享 确实有分前期与
  • matlab单个像素面积,我用MATLAB计算出了图像目标区域的像素点个数,请问知道了目标区域的像素点怎么计算目标区域的面积?...

    满意答案 下面是一个简单的计算轮廓包含起来的像素点的个数的程序 step 1 clear all clc I imread test bmp 读入图片 bwI im2bw I 0 5 转化为二值图像 L bwlabel bwI 4 将四连通
  • c++面向对象三大特征封装、继承和多态知识总结

    面向对象三大特征 封装 继承 多态 一 封装 该公开的就公开话 该私有的就隐藏掉 主要是由public private实现 作用是便于分工和分模块 防止不必要的扩展 二 继承 就是一种传承 可以把父类型中的数据传承到子类中 子类除了传承了父
  • 企业微信 事件接收服务器,授权通知事件

    TOC 授权成功通知 从企业微信应用市场发起授权时 企业微信后台会推送授权成功通知 从第三方服务商网站发起的应用授权流程 由于授权完成时会跳转第三方服务商管理后台 因此不会通过此接口向第三方服务商推送授权成功通知 请求方式 POST HTT
  • Python中获取时间戳的几种方法

    Python中获取时间戳的几种方法 时间戳是指从某个特定的时间点 通常是1970年1月1日00 00 00 UTC 到现在的总秒数 在Python中 我们可以使用多种方法获取时间戳 本文将介绍三种常用方法 使用time模块 使用dateti
  • el-tree-select树形选择 数据回显

    element plus树形选择控件回显问题 图示 问题 主要代码 注意 实现效果 图示 问题 由于用到懒加载 与一次性全部加载数据不同的是 当前只有ID 而树结构还没渲染 就会导致没有label回显 所以我们要在组件刚渲染的时候 就构造我
  • 【Git】Git的下载、安装与配置教程(图文)

    一 下载慢 官网 https git scm com 或百度搜索Git 二 下载快 CNPM Binaries Mirrorhttps registry npmmirror com binary html path git for wind
  • python爬虫(1)利用BeautifulSoup进行网络数据采集

    BeautifulSoup库的名字来源于路易斯 卡罗尔在 爱丽丝梦游仙境 里的同名诗歌 BeautifulSoup化平淡为神奇 它通过定位HTML标签来格式化和组织复杂的网络信息 用简单易用的Python对象为我们展现结构信息 在我们安装完
  • [docker简明教程] 1_docker的安装

    1 docker安装 准备工作 1 1 根据需要卸载老版本的docker 卸载前记得保存之前的容器和镜像 参考这个教程进行完全卸载 添加链接描述 1 2 按照下面的指令进行安装 添加apt源 sudo apt get update sudo
  • MySQL-show databases数据库显示不完整

    由于我的电脑不是单独安装的MySQL 而是选择安装的xampp这款软件 最近在命令行下操作数据库时发现了一点小问题 就是当我输入show databases 之后数据库显示不完整 简单的说 就是因为我选择的用户不正确导致的 当我们直接输入m
  • pytorch中torchvision.transforms.functional模块中pad函数的使用

    torchvision transforms functional模块中pad函数的使用 载入torchvision transforms functional模块 import torchvision transforms functio
  • C++/QT 获取系统CPU、内存、磁盘、进程相关信息

    最近在学习用C 获取WINDOWS和LINUX 下的系统信息 对其大概方法做了一些总结 希望对新人有一些帮助 话不多说 先来代码 首先 我针对两个平台定义了一个接口类 即纯虚函数类 其windows 和 linux 的实现类可以实现该类 接