【第39節】windows編程:打造MFC版本任務管理器

目錄

一、項目概述

二、項目開發的各種功能關鍵

2.1 進程信息的獲取

2.2 線程信息的獲取

2.3 進程模塊信息的獲取

2.3.1 模塊快照

2.3.2 枚舉模塊

2.4 進程堆信息的獲取

2.5 窗口信息的獲取

2.6 文件信息的獲取

2.7 內存信息和CPU占用率的獲取

2.7.1 內存信息相關結構體

2.7.2 相關函數

2.7.3 使用例子

2.7.4 CPU占用率

三、其它功能要點

3.1 關機、重啟,注銷,休眠

3.2 老板鍵

?四、完整示例demo

4.1 完成的基礎功能

4.2 界面說明

4.3 操作說明


一、項目概述

????????在軟件開發領域,構建一個帶界面且功能豐富的項目往往充滿挑戰。本次項目不僅要應對多樣化的數據展示需求,涵蓋文件、進程、線程等多源信息,還需處理各類用戶交互操作。接下來,讓我們一同深入探索這個項目的關鍵要點,包括復雜數據的獲取方法、界面展示的考量,以及如關機操作、老板鍵設置等特色功能的實現途徑 ,為項目開發提供全面且清晰的指引,并提供實現demo。?

????????本次開發基礎除了MFC相關知識要求,還要熟悉windows sdk開發知識點,不會的請看前面的章節。下面簡單介紹該項目要點,界面不在此講述細節實現。

二、項目開發的各種功能關鍵

2.1 進程信息的獲取

????????在Windows系統里,要獲取當前正在運行的進程,可以依靠快照系列API 。這套API挺厲害的,它不光能把正在運行的進程找出來,還能獲取到進程的模塊列表、堆這些信息。使用這套API有這么幾個步驟:
(1)拍攝快照
(2)對快照進行遍歷
(3)把快照關閉

下面就是創建進程快照,然后獲取進程列表的具體做法:

//1.先創建一個進程快照
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 stcPe32;
//2.通過一組API遍歷進程快照
Process32First(hProcessSnap, &stcPe32);
do {//3.使用從進程快照中提取出來的信息,信息已經提取到stcPe32變量中//這些信息包含進程的PID, 進程名等數據,這些數據可以顯示到界面上//4.獲取快照中下一個進程的信息
} while (Process32Next(hProcessSnap, &stcPe32));
//5關閉快照
CloseHandle(hSanp);

2.2 線程信息的獲取

????????獲取線程信息的辦法和獲取進程信息差不多,也能用快照API來操作。但是,通過這個方法遍歷得到的線程,是系統里所有的線程,并不是屬于某一個特定進程的線程。這就可能出問題了,當我們要把這些線程數據顯示到界面上的時候,就容易產生沖突。比如說,我們已經遍歷出了進程列表,接下來想查看某個特定進程的線程列表,要是直接用剛才那種獲取所有線程的方式,得到的線程就不是我們想要的。不過還好,遍歷得到的線程信息里面,有一項是父進程的PID,利用這個PID進行篩選,就能找到指定進程的全部線程了。具體的操作方法如下:

//1.創建一個線程相關的快照句柄
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
//2.循環遍歷線程信息
//通過線程快照句柄獲取第一個線程信息
Thread32First(hThreadSnap, &stcTe32))
do {//判斷這個線程的父進程IDif (stcTe32.th320wnerProcessID == 指定進程的PID) {//將線程的信息顯示到界面.}//獲取快照中下一個線程信息
} while (Thread32Next(hThreadSnap, &stcTe32))

2.3 進程模塊信息的獲取

????????模塊信息也可以通過快照API來獲取。每個進程都有自己特有的模塊信息,當我們創建快照的時候,得指定一個進程的PID,這樣創建快照的函數就能根據這個PID,把指定進程的模塊列表給取出來。

????????在獲取模塊信息的過程中,經常會碰到一個問題,那就是一般只能獲取到32位進程的模塊信息,對于64位進程的模塊,就獲取不了了。不過有個解決辦法,就是用EnumProcessModulesEx函數,這個函數比較強大,32位和64位進程的模塊它都能獲取。但是要注意,使用這個函數有個前提,就是調用這個API的進程必須得是64位的。

????????下面就分別講講這兩種獲取模塊信息方法的具體使用:

2.3.1 模塊快照

//1.創建模塊快照
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPId);
//2.循環遍歷快照中的模塊信息
MODULEENTRY32 Module32;
Module32First(hModuleSnap, Module32);
do {//將獲取到的信息顯示到界面//4.獲取快照中下一個模塊信息
} while (Module32Next(hModuleSnap, &m_Module32));
CloseHandle(hSnap);

2.3.2 枚舉模塊

(想要同時遍歷出32位和64位進程的模塊,項目必須被編譯成64位的)

HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID/*進程ID*/);
HMODULE hModules[0x2000] = {}; // 只用于獲取模塊句柄個數
DWORD dwNeed = 0; // 獲取模塊句柄個數
//枚舉進程模塊,函數會輸出模塊句柄數組
EnumProcessModulesEx(hProcess, hModules, sizeof(hModules), &dwNeed, LIST_MODULES_ALL);
DWORD dwModuleCount = dwNeed / sizeof(HMODULE);
MODULEINFO moif = {0}; //保存模塊信息的結構體
//循環獲取模塊信息
for (SIZE_T i = 0; i < dwModuleCount; ++i) {//根據進程句柄和模塊句柄獲取模塊路徑GetModuleFileNameEx(hProcess, hModules[i], 緩沖區, 長度);//根據進程句柄和模塊句柄獲取模塊其他信息GetModuleInformation(hProcess, hModules[i], &moif, sizeof(MODULEINFO))moif.EntryPoint; //dl1入口點moif.lpBaseOfD11; //dll基址moif.SizeOfImage; //dll大小//將獲取到的模塊信息顯示到界面上.
}

2.4 進程堆信息的獲取

一個進程堆的數量眾多,但遍歷方式同樣可使用快照系列API。

//1.創建一個線程相關的快照句柄
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SMAPTHREAD, O);
//2.循環遍歷線程信息
do {//1)通過線程快照句柄獲取第一個線程信息Thread32First(hThreadSnap, &stcTe32))//2)將信息顯示到界面//3)獲取快照中下一個線程信息
} while (Thread32Next(hThreadSnap, &stcTe32))

2.5 窗口信息的獲取

????????窗口信息說的就是當前系統里,正在顯示的或者隱藏著的窗口的相關內容。在Windows系統里,EnumWindow函數專門用來把當前系統上所有窗口都列出來。這里的枚舉,意思就是Windows會逐個查看所有窗口,在這個查看的過程中,它會調用一個回調函數,然后把查看到的窗口信息傳送給這個回調函數。所以,要完成枚舉窗口這件事,實際上包含兩個部分:第一,調用EnumWinodw函數;第二,在回調函數里把枚舉出來的窗口信息保存好。?

????????下面就是枚舉窗口函數用到的API原型:?

BOOL CALLBACK EnumWindowsProc(_In_    HWND hwnd, //遍歷到的窗口句柄_In_    LPARAM 1Param  //EnumWindows函數傳來的參數
);

枚舉窗口的用法為:

BOOL CALLBACK EnumWinProc(HWND hWnd, LPARAM 1Param) { //回調函數//根據窗口句柄獲取窗口名TCHAR buff[200];GetWindowText(hWnd, buff, 200); //得到窗口名,可顯示到界面中.//判斷窗口是否被隱藏if (IsWindowVisible(hWnd) == TRUE && wcslen(buff)!= 0)//窗口沒有被隱藏且窗口標題長度不為0,則將窗口信息顯示到界面中.
}
int main() {EnumWindow(&EnumWinProc/*枚舉窗口的回調函數*/, NULL/*回調函數的附加參數*/);
}

2.6 文件信息的獲取

????????Windows系統提供了一組能用來遍歷文件的API,分別是FindFirstFile和FindNextFile。FindFirstFile這個API的作用是找到一個文件夾里的第一個文件或者子文件夾。而FindNextFile呢,它負責一個接一個地去查找剩下的文件或文件夾,直到全部找完為止。所以,在使用這組API的時候,通常得先調用FindFirstFile,它會返回一個用來查找文件的句柄,拿到這個句柄后,再用FindNextFile去把剩下的文件都找出來。不過這組API有個局限性,它們只能找到當前目錄下的文件和文件夾。要是想把所有層級文件夾里的文件都找出來,那就得自己寫個遞歸函數才能做到了。

????????下面給你看看這兩個函數具體怎么簡單使用:

HANDLE hFind ;
WIN32_FIND_DATA fData;
hFind = FindFirstFile(L"D:\\*", &fData);
if (hFind == (HANDLE)-1) return ;
do {//將遍歷到的信息(fData結構體變量的內容)顯示到界面.
} while (FindNextFile(hFind, &fData));

2.7 內存信息和CPU占用率的獲取

2.7.1 內存信息相關結構體

typedef struct _MEMORYSTATUS {DWORD dwLength; //該結構體大小DWORD dwMemoryLoad; //當前系統內存的占用率(百分比)SIZE_T dwTotalPhys; //總的物理內存大小SIZE_T dwAvailPhys; //可能的物理內存大小以字節為單位SIZE_T dwTotalPageFile; //交換文件總大小SIZE_T dwAvailPageFile; //交換文件中空閑部分大小SIZE_T dwTotalVirtual; //總的虛擬內存大小SIZE_T dwAvailVirtual; //可用虛擬內存大小
}MEMORYSTATUS, *LPMEMORYSTATUS;

2.7.2 相關函數

獲取系統內存信息

void WINAPI GlobalMemoryStatus(_Out_      LPMEMORYSTATUS lpBuffer //MEMORYSTATUS結構體指針
);

2.7.3 使用例子

//1.創建結構體對象并調用獲取內存信息的函數
MEMORYSTATUS memStatus;
GlobalMemoryStatus(&memStatus);
//當前內存占用率:memStatus.dwMemoryLoad
//已用物理內存大小:memStatus.dwTotalPhys - memStatus.dwAvailPhys

2.7.4 CPU占用率

????????CPU占用率,說的就是在單位時間里,CPU處于被占用狀態的總時長。要算出這個數值,我們得先知道在一段時間內CPU實際被使用的時間,然后通過下面這個公式來計算它的占用率:

????????使用率 = 100.0 - (空閑時間÷使用時間)× 100.0;

????????至于獲取當前CPU被占用的時間,就得借助GetSystemTimes函數了。這個函數可以獲取到三個時間數據:CPU空閑下來的時間、CPU在內核態下被使用的時間,還有CPU在用戶態下被使用的時間。這里面,把CPU在內核態和用戶態被使用的時間加起來,得到的就是CPU總的使用時間。下面的代碼展示了具體計算CPU占用率的方法:

double FILETIME2Double(const _FILETIME& fileTime) {return double(fileTime.dwHighDateTime * 4.294967296e9) + double(fileTime.dwLowDateTime);
}
Int GetCpuUsage(){// 空閑時間   內核時間    用戶時間_FILETIME idleTime, kernelTime, userTime;//獲取時間GetSystemTimes(&idleTime, &kernelTime, &userTime);//等待1000毫秒HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//等待1000毫秒,使用內核對象等待會更精確WaitForSingleObject(hEvent, 1000);//獲取新的時間_FILETIME newIdleTime, newKernelTime, newUserTime;GetSystemTimes(&newIdleTime, &newKernelTime, &newUserTime);//將各個時間轉換double d01dIdleTime = FILETIME2Double(idleTime);double dNewIdleTime = FILETIME2Double(newIdleTime);double d0IdKernelTime = FILETIME2Double(kernelTime);double dNewKernelTime = FILETIME2Double(newKernelTime);double d01dUserTime = FILETIME2Double(userTime);double dNewUserTime = FILETIME2Double(newUserTime);//計算出使用率return int(100.0 - (dNewIdleTime - d0ldIdleTime) / (dNewKernelTime - d01dKernelTime + dNewUserTime - d0ldUserTime) * 100.0);
}

三、其它功能要點

3.1 關機、重啟,注銷,休眠

????????關機、重啟、注銷以及休眠,這些操作都需要較高的權限才能執行。要是一個進程的權限不夠高,去執行這些操作就會失敗。所以,要是一個程序打算進行這些操作,第一步得用管理員權限來運行,第二步還得通過專門的權限提升函數,讓程序獲得關機的特權。具體的操作步驟是這樣的:?

????????(1)把關機特權獲取到?

????????(2)進行關機相關的操作?

????????下面這段代碼就是用來開啟關機特權的?

HANDLE hToken = NULL;
HANDLE hProcess = GetCurrentProcess(); //該函數能得到該進程的偽句柄
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
TOKEN_PRIVILEGES tp = {0 };
LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid));
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//調用函數提升權限
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

下面的代碼可用于關機等操作:
1. 關機:ExitWindowsEx(EWX_POWEROFF|EWX_FORCE);
2. 重啟:ExitWindowsEx(EWX_REBOOT|EWX_FORCE);
3. 注銷:ExitWindowsEx(EWX_LOGOFF|EWX_FORCE);
4. 休眠:SetSuspendState(TRUE,FALSE,FALSE);
5. 睡眠:SetSuspendState(FALSE,FALSE,FALSE);
6. 鎖屏:LockWorkStation();

3.2 老板鍵

????????老板鍵其實就是能快速響應全局按鍵,這樣不用激活窗口,按一組特定按鍵,窗口就能迅速“消失”。?

????????用這種加強版的快捷鍵分兩步。第一步,用RegisterHotKey函數向系統注冊一個全局熱鍵,注冊的時候能對熱鍵進行設置,像熱鍵的ID、快捷鍵之類的。函數原型如下:?

BOOL WINAPI RegisterHotKey(_In_opt_   HWND hWnd,      //響應該熱鍵的窗口句柄_In_       int  id,         //該熱鍵的ID,ID值可以是自定義的一個數值_In_       UINT fsModifiers,//該熱鍵的輔助按鍵例如Ctrl鍵盤)_In_       UINT vk          //該熱鍵的鍵值,一個按鍵碼
);

注冊熱鍵的例子如下:

//注冊一個快捷鍵:Ctrl +Shift+H
::RegisterHotKey(hWnd, //當前窗口的句柄0x1234, //自定義熱鍵ID值MOD_CONTROL|MOD_SHIFT, //同時按下ctrl,shift'h'); //ctrl+shift+h

????????第二步呢,要在消息響應函數里對WM_HOTKEY消息做出反應。這個消息的WPARAM參數,其實就是我們注冊熱鍵時自己設定的那個熱鍵ID 。接著在這個消息處理過程中,就能讓窗口顯示或者隱藏。?

????????要是用SDK開發,直接在回調函數里寫case WM_HOTKEY消息的處理代碼就行。但如果是用MFC開發,因為沒辦法直接編寫消息回調函數,就得在類向導里添加PreTranslateMessage虛函數來處理這個消息。下面就是相關代碼:?

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) {//判斷消息是否是全局熱鍵消息,并判斷該熱鍵的ID是否是我們注冊過的if ((pMsg->message == WM_HOTKEY) && (pMsg->wParam == 0x1234)) {if (IsWindowVisible(m_hWnd) == TRUE)ShowWindow(SW_HIDE); //隱藏窗口elseShowWindow(SW_SHOW); //顯示窗口}return CDialogEx::PreTranslateMessage(pMsg);
}

?四、完整示例demo

MFC任務管理器說明書

4.1 完成的基礎功能

1 遍歷進程
2 遍歷線程
3 遍歷模塊
4 遍歷堆
5 結束進程,掛起線程,恢復運行線程,結束線程
6 獲取CPU,內存信息
7 遍歷文件信息:文件名,創建時間,修改時間,文件大小
8 遍歷窗口信息
9 掃描并清理VS工程垃圾

附加功能如下:
1 老板鍵及其他快捷鍵:如ctrl+7隱藏程序,再次恢復顯示程序
2 進程列表按列排序,根據整數或者字符串排序顯示
3 利用定時器自主設置進程表刷新速度
4 主菜單項:關機,重啟,注銷,休眠,睡眠,鎖屏
5 刷新窗口信息和關閉窗口
6 增加線程更新cpu和內存信息
7 查看有些堆信息有點卡頓,增加線程查看堆信息

開發環境:Windows10+VS2015+CPP

4.2 界面說明

1 菜單選項有:
刷新速度
關機 ctrl+1
重啟 ctrl+2
注銷 ctrl+3
休眠 ctrl+4
睡眠 ctrl+5
鎖屏 ctrl+6
隱藏 ctrl+7

2 CPU利用率 內存占用率

3 TAB選項
進程 文件 窗口 清理

進程:顯示進程列表,根據進程ID可以查看對應的線程,模塊和堆
文件:查看某文件夾或磁盤的文件
窗口:查看當前所有顯示窗口
清理:清理VS工程的工具

4.3 操作說明

????????可以鼠標左鍵單擊菜單選項操作,在進程列表,線程模塊堆和窗口列表可以使用鼠標右鍵菜單操作。其他子窗口看界面說明。

????????注意事項:程序操作中,如結束進程,掛起線程,恢復運行線程,結束線程,查看模塊,堆信息有些會失敗,可能因為權限不夠或者被限制。

進程

文件

窗口

清理

demo代碼:https://download.csdn.net/download/linshantang/90530350

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76692.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76692.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算軸承|滾動軸承故障頻率

一、軸承故障頻率概述 在旋轉機械故障診斷中&#xff0c;軸承故障頻率&#xff08;BPFO、BPFI、BSF、FTF&#xff09;是重要的分析依據。通過計算這些特征頻率&#xff0c;可以幫助工程師&#xff1a; 識別軸承故障類型&#xff08;內圈/外圈/滾動體故障&#xff09;制定振動…

【數據結構與算法】ArrayList 和 順序表

文章目錄 &#x1f332;List&#x1f332;1. 線性表&#x1f332;2. 順序表&#x1f33f;2.1 MyArrayList2.1.1 類中重寫所有接口方法1.新增元素2.在pos位置新增元素(指定位置)3.判定是否包含了某個特定元素 4.查找特定元素對應的位置 5.獲取pos下標的元素 6.給pos位置的元素替…

OceanBase 推出單機版 ,為中小規模業務提供高性價比方案

近日&#xff0c;OceanBase正式推出了全新的單機版數據庫。這款產品基于OceanBase自主研發的單機分布式一體化架構&#xff0c;具有精簡的架構設計和出色的兼容性&#xff0c;能夠為中小規模業務場景提供高性價比的數據庫解決方案&#xff0c;充分滿足客戶在不同業務規模下的多…

如何在 Vue 3 中實現百度地圖位置選擇器組件

如何在 Vue 3 中實現百度地圖位置選擇器組件 前言 在開發前端應用時&#xff0c;地圖選擇器是一個非常常見的需求。尤其是在一些需要用戶選擇地址的場景&#xff0c;如電商平臺、旅游網站、酒店預定等&#xff0c;百度地圖組件能提供準確的地理位置服務。在本文中&#xff0c…

Python中如何用正則表達式精準匹配IP地址?

在網絡編程和數據處理時&#xff0c;我們經常需要從文本中提取或驗證IP地址。Python的正則表達式(re模塊)是完成這個任務的利器。但你知道怎么寫才能準確匹配各種合法的IP地址嗎&#xff1f;今天我們就來詳細探討這個問題。 為什么需要IP正則表達式&#xff1f; 假設你正在分…

spring--聲明式事務

聲明式事務 1、回顧事務 要么都成功&#xff0c;要么都失敗&#xff01; 事務在項目開發中&#xff0c;十分重要&#xff0c;涉及數據的一致性問題 確保完整性和一致性 事務ACID&#xff1a; 原子性&#xff1a;事務是原子性操作&#xff0c;由一系列動作組成&#xff0c;…

Kotlin 學習-集合

/*** kotlin 集合* List:是一個有序列表&#xff0c;可通過索引&#xff08;下標&#xff09;訪問元素。元素可以在list中出現多次、元素可重復* Set:是元素唯一的集合。一般來說 set中的元素順序并不重要、無序集合* Map:&#xff08;字典&#xff09;是一組鍵值對。鍵是唯一的…

WPF 五子棋項目文檔

WPF 五子棋項目文檔 1. 項目概述 本項目是一個使用 Windows Presentation Foundation (WPF) 技術棧和 C# 語言實現的桌面版五子棋&#xff08;Gomoku&#xff09;游戲。它遵循 MVVM&#xff08;Model-View-ViewModel&#xff09;設計模式&#xff0c;旨在提供一個結構清晰、可…

計算機操作系統——死鎖(詳細解釋和處理死鎖)

系列文章目錄 計算機操作系統-計算機系統中的死鎖 文章目錄 系列文章目錄前言一、資源問題&#xff1a; 計算機系統當中的死鎖&#xff1a; 二、死鎖的定義、必要條件和處理方法&#xff1a; 1.死鎖的定義&#xff1a;2.產生死鎖的必要條件&#xff1a;3.處理死鎖的方法&#…

Springboot項目正常啟動,訪問資源卻出現404錯誤如何解決?

我在自己的springboot項目中的啟動類上同時使用了SprinBootApplication和ComponentScan注解, 雖然項目能夠正常啟動,但是訪問資源后,返回404錯誤,隨后在啟動類中輸出bean,發現controller創建失敗: 而后我將ComponentScan去掉后資源就能訪問到了. 原因 SprinBootApplication本身…

第十五屆藍橋杯C/C++B組省賽真題講解(分享去年比賽的一些真實感受)

試題A——握手問題 一、解題思路 直接用高中學的排列組合思路 二、代碼示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…

動態規劃(6)——01背包問題

歡迎來到博主的專欄&#xff1a;算法解析 博主ID&#xff1a;代碼小號 文章目錄 牛客網——【模板】01背包題目解析題目1算法原理題目1題解代碼。問題2算法原理問題2題解代碼01背包問題的滾動數組優化 牛客網——【模板】01背包 題目解析 關于I/O相關的東西博主就不多贅述了&a…

TQTT_KU5P開發板教程---實現流水燈

文檔實現功能介紹 本文檔是學習本開發板的基礎&#xff0c;通過設置計數器使led0到led7依次閃爍&#xff0c;讓用戶初步認識vivado基本的開發流程以及熟悉項目的創建。本開發板的所有教程所使用的軟件都是vivado2024.1版本的。可以根據網上的教程下載與安裝。 硬件資源 此次教程…

Spring 中的 @Cacheable 緩存注解

1 什么是緩存 第一個問題&#xff0c;首先要搞明白什么是緩存&#xff0c;緩存的意義是什么。 對于普通業務&#xff0c;如果要查詢一個數據&#xff0c;一般直接select數據庫進行查找。但是在高流量的情況下&#xff0c;直接查找數據庫就會成為性能的瓶頸。因為數據庫查找的…

SEER: Self-Aligned Evidence Extraction for Retrieval-AugmentedGeneration

一、動機 如何從檢索到的段落中提取證據&#xff0c;以降低計算成本并提升最終的RAG性能&#xff0c;然而這一問題仍然具有挑戰性。 現有方法 嚴重依賴于基于啟發式的增強&#xff0c;面臨以下幾個問題&#xff1a; &#xff08;1&#xff09;由于手工制作的上下文過濾&…

毫米波測試套裝速遞!高效賦能5G/6G、新材料及智能超表面(RIS)研發

德思特&#xff08;Tesight&#xff09;作為全球領先的測試測量解決方案提供商&#xff0c;始終致力于為前沿技術研發提供高精度、高效率的測試工具。 針對毫米波技術在高頻通信、智能超表面&#xff08;RIS&#xff09;、新材料等領域的快速應用需求&#xff0c;我們推出毫米…

三維激光測量助力企業檢測效率提升3倍

智能制造與數字化浪潮席卷下&#xff0c;三維掃描技術已成為工業檢測領域不可或缺的工具。面對傳統檢測手段的精度瓶頸與效率局限&#xff0c;三維掃描儀&#xff0c;以毫米級精度、非接觸式測量與超高速掃描三大核心優勢&#xff0c;為汽車制造、航空航天、消費電子等行業的品…

SQL:Normalization(范式化)

目錄 Normalization&#xff08;范式化&#xff09; 為什么需要 Normalization&#xff1f; &#x1f9e9; 表格分析&#xff1a; 第一范式&#xff08;1NF&#xff09; 什么是第一范式&#xff08;First Normal Form&#xff09;&#xff1f; 第二范式&#xff08;2NF&am…

#MES系統運維問題分析思路

一套適用于90% MES運維現場問題的排查分析思維模型&#xff0c;叫做&#xff1a; &#x1f50d; MES系統問題分析七步法&#xff08;現場實戰適用&#xff09; ? 第一步&#xff1a;明確問題現象&#xff08;What&#xff09; 問題要說清楚&#xff0c;“不能操作”這種模糊描…

達夢數據庫-學習-18-ODBC數據源配置(Linux)

一、環境信息 名稱值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系統CentOS Linux release 7.9.2009 (Core)內存4G邏輯核數2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…