主頁 > 軟體工程 > pdh獲取windows下的磁盤讀寫速率?

pdh獲取windows下的磁盤讀寫速率?

2020-09-19 06:45:54 軟體工程

// 磁盤.cpp: 定義控制臺應用程式的入口點。
//

#include "stdafx.h"
#pragma comment(lib,"pdh")  
#include <stdio.h>  
#include <stdlib.h>  
#include <malloc.h>  
#include <locale.h>  
#include <pdh.h>  
#include <pdhmsg.h>  
#include <tchar.h>  
#include <windows.h>  

int nCPU;

int GetData()
{
HQUERY query;
double dbVal;
long iVal;
PDH_STATUS status = PdhOpenQuery(NULL, NULL, &query);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("打開失敗"), TEXT(""), MB_OK);
return -1;

}

HCOUNTER cntProcessCPU, cntProcessMemory;
HCOUNTER cntProcessDiskRead, cntProcessDiskWrite;
status = PdhAddCounterA(query, "\\Process(tfb_manage_system)\\% Processor Time", NULL, &cntProcessCPU);
status = PdhAddCounterA(query, "\\Process(tfb_manage_system)\\Working Set - Private", NULL, &cntProcessMemory);
status = PdhAddCounterA(query, "\\Process(tfb_manage_system)\\IO Read Bytes/sec", NULL, &cntProcessDiskRead);
status = PdhAddCounterA(query, "\\Process(tfb_manage_system)\\IO Write Bytes/sec", NULL, &cntProcessDiskWrite);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("添加失敗"), TEXT(""), MB_OK);
return -1;
 
}

status = PdhCollectQueryData(query);
Sleep(500);                 //這里要有延時不然結果相當不準確    
status = PdhCollectQueryData(query);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("資料請求失敗"), TEXT(""), MB_OK);
return -1;
}
printf("=====");
PDH_FMT_COUNTERVALUE pdhValue;
DWORD dwValue;

status = PdhGetFormattedCounterValue(cntProcessCPU, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("得到資料失敗"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-CPU:          %3d%%          ", (int)(dbVal / nCPU + 0.5));
}

status = PdhGetFormattedCounterValue(cntProcessMemory, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("得到資料失敗"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-Memory:     %8dK        \n", (int)(dbVal / 1024));
}

status = PdhGetFormattedCounterValue(cntProcessDiskRead, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("得到資料失敗"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-DiskRead:%8dK/s        ", (int)(dbVal / 1024));
}

status = PdhGetFormattedCounterValue(cntProcessDiskWrite, PDH_FMT_DOUBLE, &dwValue, &pdhValue);
if (ERROR_SUCCESS != status)
{
MessageBox(NULL, TEXT("得到資料失敗"), TEXT(""), MB_OK);
return -1;
}
else
{
dbVal = pdhValue.doubleValue;
printf("Process-DiskWrite:%8dK/s        \n*****************************************************************************\n", (int)(dbVal / 1024));
}

PdhRemoveCounter(cntProcessCPU);
PdhRemoveCounter(cntProcessMemory);
PdhRemoveCounter(cntProcessDiskRead);
PdhRemoveCounter(cntProcessDiskWrite);
PdhCloseQuery(query);
}


int main() {
setlocale(LC_ALL, "chs");

SYSTEM_INFO si;
GetSystemInfo(&si);
nCPU = si.dwNumberOfProcessors;

while (1)
{
Sleep(500);
GetData();
}
system("pause");
return 0;
}
會出現一個錯誤,就是PDH_NO_DATA from PDHCOLLECTQUERYDATA,有人說是 wrong instance ,我也不知道哪里錯了,求問各位

uj5u.com熱心網友回復:

是編譯錯誤還是運行中間錯誤

如果是運行錯誤,執行到哪里出錯?

uj5u.com熱心網友回復:

僅供參考:
#pragma comment(lib,"pdh")
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <locale.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <tchar.h>
#include <windows.h>
//一.性能計數器簡介:
//系統性能計數器?也許好多朋友沒有用過吧!(獻丑了)此物可謂功能強大,顧名思義就是可以統計 Windows 系統各項性能指標的東西。在 Windows 2000 及以上系統中,如果是默認安裝就會自帶性能計數器程式,大家可以在 “控制面板 -〉管理 -〉性能”中看到該程式。
//Windows 系統性能計數器可以實時跟蹤上百項系統性能指標,在該系統程式的繪圖界面上滑鼠右擊,選擇“添加計數器”就有可能看到所有可統計的專案。常常在論壇里看到一些新朋友問如何自己實作任務管理器,及如何實時獲得每個行程的CPU使用率,記憶體使用...等等,那么我想使用系統性能計數器應該是最佳選擇。言歸正傳,實作方法,請看下文。
//二.具體實作:
//相關API簡介及事例代碼:
bool pdhdump() {
//1.PdhOpenQuery:打開計數器
    PDH_STATUS pdhStatus;
//  HQUERY hQuery = NULL;
//  HCOUNTER pCounterHandle = NULL;
//  pdhStatus = PdhOpenQuery(0, 0, &hQuery);
//  if (pdhStatus != ERROR_SUCCESS) return false;
//  //分配計數器句柄空間
//  pCounterHandle = (HCOUNTER *)GlobalAlloc(GPTR, sizeof(HCOUNTER));
//  if (pCounterHandle == NULL) return false;
//2.PdhCloseQuery:關閉計數器
//  pdhStatus = PdhCloseQuery(hQuery);
//  if (pdhStatus != ERROR_SUCCESS) return false;
//3.PdhEnumObjects:列舉計數專案,該函式有6個引數(詳細請看MSDN)
//原型:
//PDH_STATUS PdhEnumObjects(
//      LPCTSTR szDataSource,    // 必須為 NULL
//      LPCTSTR szMachineName,   // 機器名,如果為本機可以為NULL
//      LPTSTR mszObjectList,    // 接收全部可用計數專案的緩沖區
//      LPDWORD pcchBufferLength,  // 緩沖去大小(如果為 0,則該值回傳所需大小)
//      DWORD dwDetailLevel,    // 獲取資訊的級別
//      BOOL bRefresh        // 一般設定為 TRUE
//      );
//舉例:
    LPTSTR lpcsMachineName= NULL;
    LPTSTR lpsObjectListBuffer = NULL;
    DWORD dwObjectListSize = 0;

    //第一步先把緩沖去大小置為0,這樣可獲得所需緩沖區大小
    pdhStatus = PdhEnumObjects(
       NULL,
       lpcsMachineName,
       lpsObjectListBuffer,
       &dwObjectListSize,
       PERF_DETAIL_WIZARD,
       TRUE);
    if (pdhStatus != ERROR_SUCCESS && pdhStatus != PDH_MORE_DATA) return false;
    //得到緩沖區大小后,分配快取區記憶體
    lpsObjectListBuffer = (LPTSTR)malloc(dwObjectListSize + 1);
    if (lpsObjectListBuffer == NULL) return false;
    //第二步在此呼叫列舉函式真正開始列舉計數專案
    pdhStatus = PdhEnumObjects(
           NULL,
           lpcsMachineName,
           lpsObjectListBuffer,
           &dwObjectListSize,
           PERF_DETAIL_WIZARD,
           TRUE);
    if (pdhStatus != ERROR_SUCCESS) return false;
    //保存緩沖區地址
    LPTSTR lpsthisObject = NULL;
    lpsthisObject = lpsObjectListBuffer;
    //列印所有可用計數專案
    if (dwObjectListSize>0)
    for ( ; *lpsthisObject != 0 ; lpsthisObject += (strlen(lpsthisObject) + 1)) {
        printf("Object:%s\n",lpsthisObject);
//4.PdhEnumObjectItems:列舉計數器及實體
//原型:
//PDH_STATUS PdhEnumObjectItems(
//       LPCTSTR szDataSource,        // 必須為NULL
//       LPCTSTR szMachineName,       // 機器名,如果為本機可以為NULL
//       LPCTSTR szObjectName,        // 計數專案(通過PdhEnumObjects函式可獲得所有可用專案)
//       LPTSTR mszCounterList,       // 計數器緩沖區
//       LPDWORD pcchCounterListLength,   // 計數器緩沖區大小
//       LPTSTR mszInstanceList,       // 計數實體緩沖區
//       LPDWORD pcchInstanceListLength,   // 計數實體緩沖區大小
//       DWORD dwDetailLevel,        // 獲取資訊的級別
//       DWORD dwFlags            // 0
//       );
//舉例:該函式的方法同上一函式(PdhEnumObjects),具體請看MSDN或本文附帶的測驗工程代碼
        LPTSTR mszCounterList=NULL;
        LPTSTR mszInstanceList=NULL;
        DWORD dwCounterListLength=0;
        DWORD dwInstanceListLength=0;
        //第一步先把緩沖去大小置為0,這樣可獲得所需緩沖區大小
        pdhStatus = PdhEnumObjectItems(
            NULL,
            lpcsMachineName,
            lpsthisObject,
            mszCounterList,
            &dwCounterListLength,
            mszInstanceList,
            &dwInstanceListLength,
            PERF_DETAIL_WIZARD,
            0);
        if (pdhStatus != ERROR_SUCCESS && pdhStatus != PDH_MORE_DATA) return false;
        //得到緩沖區大小后,分配快取區記憶體
        mszCounterList = (LPTSTR)malloc(dwCounterListLength + 1);
        if (mszCounterList== NULL) return false;
        mszInstanceList= (LPTSTR)malloc(dwInstanceListLength+ 1);
        if (mszInstanceList== NULL) return false;
        pdhStatus = PdhEnumObjectItems(
            NULL,
            lpcsMachineName,
            lpsthisObject,
            mszCounterList,
            &dwCounterListLength,
            mszInstanceList,
            &dwInstanceListLength,
            PERF_DETAIL_WIZARD,
            0);
        if (pdhStatus != ERROR_SUCCESS) return false;
        LPTSTR lpsthisCounter = NULL;
        lpsthisCounter = mszCounterList;
        if (dwCounterListLength>0)
        for ( ; *lpsthisCounter != 0 ; lpsthisCounter += (strlen(lpsthisCounter) + 1)) {
            printf("    Counter:%s\n",lpsthisCounter);
        }
        LPTSTR lpsthisInstance = NULL;
        lpsthisInstance = mszInstanceList;
        if (dwInstanceListLength>0)
        for ( ; *lpsthisInstance != 0 ; lpsthisInstance += (strlen(lpsthisInstance) + 1)) {
            printf("    Instance:%s\n",lpsthisInstance);
        }
        free(mszInstanceList);
        free(mszCounterList);
    }
    free(lpsObjectListBuffer);
    return true;
}
//5.PdhAddCounter:添加計數器
//統計感興趣的系統資訊時,必須先將對應的計數器添加進來
//原型:
//PDH_STATUS PdhAddCounter(
//     PDH_HQUERY hQuery,     // 為PdhOpenQuery打開的句柄
//     LPCTSTR szFullCounterPath, // 計數器路徑(最大長度為 PDH_MAX_COUNTER_PATH)
//     DWORD_PTR dwUserData,    // 置為 0
//     PDH_HCOUNTER* phCounter   // 計數器句柄空間(本文中在PdhOpenQuery函式后已分配)
//     );
//舉例:
// 已獲取winlogon.exe行程的CPU使用率為例
// 通過列舉并查看計數專案說明可以知道 process 專案是和行程有關的專案
// 再通過列舉計數器和事例并查看說明可以知道 process 專案下的% Processor Time計數器是關于行程CPU使率的
// 最后在計數器事例中看到winlogon行程(表明該行程正在運行)
//  pdhStatus = PdhAddCounter (hQuery, "//process(winlogon)//% Processor Time", 0, pCounterHandle);
//  if (pdhStatus != ERROR_SUCCESS) return false;
//提示:有些計數器沒有實體,比如:要得到系統自啟動到現在所運行的秒數,那么該計數專案為System,計數器為System Up Time,計數器實體為NULL,這時的計數器路徑為"/System/System Up Time"
//6.PdhCollectQueryData: 準備獲取當前資料
//舉例:
//  pdhStatus = PdhCollectQueryData(hQuery);
//  if (pdhStatus != ERROR_SUCCESS)return false;
//7.PdhGetFormattedCounterValue:得到資料
//舉例:
//  pdhStatus = PdhGetFormattedCounterValue (pCounterHandle, PDH_FMT_DOUBLE,
//             &dwctrType, &fmtValue);
//  if (pdhStatus != ERROR_SUCCESS) return false;
//  // PDH_FMT_DOUBLE表示回傳double型資料,當然還可以回傳int等型別資料,請查MSDN
//  // 獲取下一時刻資料
//  pdhStatus = PdhCollectQueryData(hQuery);
//  if (pdhStatus != ERROR_SUCCESS)return false;
//提示:pCounterHandle為PdhAddCounter得到的句柄,可以不同的pCounterHandle獲得不同計數值
//8.PdhRemoveCounter:移出計數器
//不想獲取某項計數值時,應該移出該計數器,已節省資源
//舉例:
//  if (PdhRemoveCounter(pdhCouner) != ERROR_SUCCESS) return false;
//該函式引數為計數器句柄
//至此,如果使用計數器實時跟蹤系統資訊已經講解完畢。如還有不明白的朋友請詳細察看MSDN或與Email:[email protected] 或 QQ:8573980聯系。

//三.最后再附帶介紹一個相關API PdhGetCounterInfo,這個API與使用計數器并無關系,但是,它可以讓你明白你所感興趣的計數器的路徑。既它可以得到每個計數器的專案的描述資訊(可是中文的哦!)
//舉例:
//  //以獲取系統自啟動到現在所運行的秒數為例
//  PDH_COUNTER_INFO pdhCounterInfo;
//  DWORD dwCounterBuffsize;
//  //添加計數器
//  pdhStatus = PdhAddCounter(hQuery, "//System//System Up Time", 0, pCounterHandle);
//  if (pdhStatus != ERROR_SUCCESS) return false;
//  //得到緩沖區大小
//  pdhStatus = PdhGetCounterInfo(*pCounterHandle, TRUE, &dwCounterBuffsize, NULL);
//  if (pdhStatus != ERROR_SUCCESS && pdhStatus != PDH_MORE_DATA) return false;
//  //設定緩沖區
//  BYTE  * byCounterBuff = (BYTE *)malloc(dwCounterBuffsize);
//  //獲取資訊
//  pdhStatus = PdhGetCounterInfo (*pCounterHandle, TRUE, &dwCounterBuffsize, (PPDH_COUNTER_INFO)byCounterBuff);
//  if (pdhStatus != ERROR_SUCCESS) return false;
//  pdhCounterInfo = * (PPDH_COUNTER_INFO)byCounterBuff;
//  //列印得到的資訊
//  printf(pdhCounterInfo->szExplainText);
//  //以上列印得資訊類似:"System Up Time 指計算機自上次啟動后已經運行的時間(用秒計算)。這個計數值顯示啟動時間和當前時間之差。"
//全部介紹完畢,希望本文能對大家有所幫助,祝大家愉快。
//example code:
int ExistSameName(TCHAR *ProcessName) {
    //TODO:判斷當前行程串列中有沒有同名行程,如果有回傳第幾個同名行程
    return 0;
}
char *RenameEx(char *tmp,int num) {
    //TODO:在tmp中的字串末尾添加#num
    return tmp;
}
int GetCPUUsage(TCHAR *ProcessName) {
    HQUERY          hQuery;
    HCOUNTER        *pCounterHandle;
    PDH_STATUS      pdhStatus;
    PDH_FMT_COUNTERVALUE  fmtValue;
    DWORD           ctrType;
    CHAR            szPathBuffer[MAX_PATH];
    int             RetVal = 0;
    pdhStatus = PdhOpenQuery(NULL, 0, &hQuery);//打開查詢物件

    pCounterHandle = (HCOUNTER *)GlobalAlloc(GPTR, sizeof(HCOUNTER));

    //合成查詢字串
    char *process = NULL;    //處理之后的行程計數器名
    if (strstr(ProcessName,".exe") || strstr(ProcessName,".EXE")) {
        //如果是以exe結尾,去掉后綴名
        int len = strlen(ProcessName) - 4;
        char * tmp =new char [len + 6];//為后面#num留出空間
        memcpy(tmp , ProcessName, len);
        tmp[len] = 0;
        process = tmp;

        int num = ExistSameName(ProcessName);    //需要計數
        if (num) {//重名
            //如果有同名行程,當前計數器名字改為 "ProcessName#num"
            //如 MSDEV.EXE,則有 MSDEV,MSDEV#1,MSDEV#2
            process = RenameEx(tmp, num);
        }
    } else if (strcmpi(ProcessName, "System Idle Process")) {
        //如果是系統空閑行程,可指定計數器名字為Idle
        int len = strlen("Idle");
        char * tmp = new char[len + 1];
        strncpy(tmp, "Idle", len);
        tmp[len] = 0;
        process = tmp;
    } else {
        //名為System的行程
        process = ProcessName;
    }

    sprintf(szPathBuffer,"//Process(%s)//%% Processor Time", process);
    pdhStatus = PdhAddCounter(hQuery, szPathBuffer , 0 , pCounterHandle);
    pdhStatus = PdhCollectQueryData(hQuery);
    pdhStatus = PdhGetFormattedCounterValue (//獲取計數器當前值
        *pCounterHandle,//計數器句柄
        PDH_FMT_LONG | PDH_FMT_NOSCALE,      //format格式
        &ctrType,       //控制型別
        &fmtValue);     //回傳值
    if (pdhStatus == ERROR_SUCCESS) {
        //fmtValue.doubleValue為所要的結果
        RetVal = fmtValue.longValue;// [type: double,long,string,large]
    } else {
        RetVal = 0;
    }
    pdhStatus = PdhCloseQuery(hQuery);//關閉查詢句柄
    return RetVal;
}
int main() {
    setlocale(LC_ALL,"chs");
    pdhdump();
    return 0;
}

uj5u.com熱心網友回復:

Debug下自己單步執行一下看看,找到出錯的代碼先~

uj5u.com熱心網友回復:

就是運行中錯誤,運行后一直彈出“資料請求失敗”,應該就是status = PdhCollectQueryData(query);這個出錯了,但是不知道怎么修改

uj5u.com熱心網友回復:

參考 4 樓 weixin_40937947 的回復:
就是運行中錯誤,運行后一直彈出“資料請求失敗”,應該就是status = PdhCollectQueryData(query);這個出錯了,但是不知道怎么修改

一個是是否管理員權限運行,另一個就是你引數是不是對

uj5u.com熱心網友回復:

PdhCollectQueryData
The PdhCollectQueryData function collects the current raw data value for all counters in the specified query and updates the status code of each counter.

PDH_STATUS PdhCollectQueryData(
  IN HQUERY hQuery  // handle of the query
);
 
Parameters
hQuery 
The handle of the query from which to collect data. 
Return Values
If the function succeeds, it returns ERROR_SUCCESS.

If the function fails, the return value is a PDH error status defined in pdhmsg.h. The following are possible error values:

Value Meaning 
PDH_INVALID_HANDLE The query handle is not valid. 
PDH_NO_DATA The query does not currently have any counters. 


Remarks
The PdhCollectQueryData function can succeed, but may not have collected data for all counters. Always check the status code of each counter in the query before using the data.

See Also
Performance Data Helper Overview, Performance Data Functions, , PdhOpenQuery 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/79640.html

標籤:硬件/系統

上一篇:MFC中能直接將mysql資料庫中資料直接導成sql腳本嗎

下一篇:extended combo box

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more