2017-01-05 22 views
0
LOGICAL_PROCESSOR_RELATIONSHIP Relationship = {}; 
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *m_pinfoBase = nullptr; 
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *m_pinfoCurrent = nullptr; 
DWORD m_cbRemaining = 0; 
DWORD cb = 0; 

m_pinfoBase =reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *>(LocalAlloc(LMEM_FIXED, cb)); 

if (!GetLogicalProcessorInformationEx(Relationship, 
    m_pinfoBase, &cb)) 
{ 
    printf("Error 1 %d\n",GetLastError()); 
    //return; 
} 
else 
{ 
    printf("ActiveCores:%d\n", m_pinfoBase->Group.GroupInfo->ActiveProcessorCount); 
} 

我,usage details of the api擡頭的文件混淆,也是我擡頭SO等各個環節,我寫了一個小片段,以獲取活動核心和api GetLogicalProcessorInformationEx返回ERROR_INSUFFICIENT_BUFFER。我有兩個問題,試圖讓活動核心,以GetLogicalProcessorInformationEx WINAPI的使用

  1. 在_PROCESSOR_GROUP_INFO結構的正確ActiveProcessorCount使活動即已啓動的核的數量?
  2. 什麼是錯在我的代碼snippe
+1

你爲什麼分配0字節?網上有很多示例顯示如何執行此操作。你爲什麼要使用LocalAlloc? –

回答

0

ActiveProcessorCount:活動處理器中的數量。


2.什麼的錯誤在我的代碼片段?

絕對所有

代碼示例如何與GetLogicalProcessorInformationEx

void TestLP2() 
{ 
    ULONG rcb = 0x100, Size, err; 

    PVOID buf; 

    BOOL fOk; 

    do 
    { 
     if (buf = new UCHAR[rcb]) 
     { 
      fOk = GetLogicalProcessorInformationEx(RelationAll, (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)buf, &rcb); 

      err = GetLastError(); 

      if (fOk) 
      { 
       if (rcb) 
       { 
        union { 
         PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX pslpi; 
         PBYTE pb; 
        }; 

        pslpi = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)buf; 

        do 
        { 
         DumpLPI(pslpi); 

         Size = pslpi->Size; 
         pb += Size; 

        } while (rcb -= Size); 
       } 
      } 

      delete [] buf; 
     } 
     else 
     { 
      break; 
     } 

    } while (!fOk && err == ERROR_INSUFFICIENT_BUFFER); 
} 

工作DumpLPI實現可以是下一個:輸出的

void DumpLPI(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX pslpi) 
{ 
    union { 
     PPROCESSOR_RELATIONSHIP Processor; 
     PNUMA_NODE_RELATIONSHIP NumaNode; 
     PCACHE_RELATIONSHIP Cache; 
     PGROUP_RELATIONSHIP Group; 
    }; 

    Processor = &pslpi->Processor; 

    switch (pslpi->Relationship) 
    { 
    case RelationProcessorPackage: 
     DbgPrint("RelationProcessorPackage(GroupCount = %u)\n", Processor->GroupCount); 

     if (WORD GroupCount = Processor->GroupCount) 
     { 
      PGROUP_AFFINITY GroupMask = Processor->GroupMask; 
      do 
      { 
       DbgPrint("group<%u> Mask = %08x\n", GroupMask->Group, GroupMask->Mask); 
      } while (GroupMask++, --GroupCount); 
     } 
     break; 

    case RelationProcessorCore: 
     DbgPrint("RelationProcessorCore(%x): Mask = %08x\n", Processor->Flags, Processor->GroupMask->Mask); 
     break; 

    case RelationGroup: 
     DbgPrint("RelationGroup(%u/%u)\n", Group->ActiveGroupCount, Group->MaximumGroupCount); 

     if (WORD ActiveGroupCount = Group->ActiveGroupCount) 
     { 
      PPROCESSOR_GROUP_INFO GroupInfo = Group->GroupInfo; 
      do 
      { 
       DbgPrint("<%u/%u %08x>", 
        GroupInfo->ActiveProcessorCount, 
        GroupInfo->MaximumProcessorCount, 
        GroupInfo->ActiveProcessorMask); 
      } while (GroupInfo++, --ActiveGroupCount); 
     } 
     break; 

    case RelationCache: 
     DbgPrint("Cache L%u (%x, %x) %x\n", Cache->Level, Cache->LineSize, Cache->CacheSize, Cache->Type); 
     break; 

    case RelationNumaNode: 
     DbgPrint("NumaNode<%u> (group = %u, mask = %08x)\n", NumaNode->NodeNumber, NumaNode->GroupMask.Group, NumaNode->GroupMask.Mask); 
     break; 
    default: 
     DbgPrint("unknown Relationship=%x\n", pslpi->Relationship); 
    } 
} 

例如:

RelationProcessorPackage(GroupCount = 1) 
group<0> Mask = 0000000f 
RelationProcessorCore(1): Mask = 00000003 
Cache L1 (40, 8000) 2 
Cache L1 (40, 8000) 1 
Cache L2 (40, 40000) 0 
Cache L3 (40, 300000) 0 
RelationProcessorCore(1): Mask = 0000000c 
Cache L1 (40, 8000) 2 
Cache L1 (40, 8000) 1 
Cache L2 (40, 40000) 0 
NumaNode<0> (group = 0, mask = 0000000f) 
RelationGroup(1/1) 
<4/4 0000000f> 
+1

alloca?真?這是一個總新手。 –

+0

@DavidHeffernan'alloca'(與'_alloca'相同) - https://msdn.microsoft.com/en-us/library/wb1s57t5.aspx。爲什麼不 ?我使用這種代碼(對於未知的緩衝區大小多年)。這是絕對正確的。我可以使用它,因爲深入瞭解如何在堆棧中分配變量,如何配置堆棧。但是我知道「這是一個完全新手」,就像你說的那樣 - 爲此我粘貼替代實現 - TestLP2()。然而,如果'TestLP()' - 傷害別人的感受,我可以刪除它 - 沒問題 – RbMm

+1

簡單性對於初學者來說是最好的。不要提供太多的選擇。不要使用LocalAlloc,使用新的C++ –