//From Snooper Thread.cpp in MPI Library while (true) { PDH_STATUS status; DWORD dwValue = 6448; HQUERY Query = 0; HCOUNTER ProcCounter; HCOUNTER MemCounter; //HCOUNTER IPCounter; // WSA doesn't have a 'wait for single event' command so wait on an array with one element result = WSAWaitForMultipleEvents(1, &sock_event, TRUE, INFINITE, FALSE); WSAEnumNetworkEvents(sock, sock_event, &nevents); if (nevents.lNetworkEvents & FD_CLOSE) { if (Query) PdhCloseQuery( Query ); closesocket(sock); delete arg; return 0; } else { if (nevents.lNetworkEvents) { DWORD dwCommand = 0; LONG lProcessorValue = 0; int iError = 0; int iNameLength; PDH_STATISTICS statistics; PDH_STATISTICS statisticsmemory; //PDH_STATISTICS statisticsIP; PDH_RAW_COUNTER RawValue[TOTAL_PROCESSOR_LOOPS]; PDH_RAW_COUNTER RawValueMemory[TOTAL_PROCESSOR_LOOPS]; //PDH_RAW_COUNTER RawValueIP[TOTAL_PROCESSOR_LOOPS]; memset(RawValue, 0, sizeof(PDH_RAW_COUNTER) * TOTAL_PROCESSOR_LOOPS); // read from the socket and do whatever iError = recv(sock, (char *)&dwCommand, sizeof(DWORD), 0); iNameLength = strlen(arg->mpi->mpi_name); iNameLength +=1; iError = send(sock, (char*)&iNameLength, sizeof(LONG), 0); iError = send(sock, (char*)&arg->mpi->mpi_name, iNameLength, 0); if (!Query) { status = PdhOpenQuery(NULL,// reserved dwValue, // a value associated with this query &Query // pointer to a buffer that will receive the // query handle ); status = PdhAddCounter( Query, // handle to the query "\\System\\% Total Processor Time", //"\\Processor(0)\\% Processor Time", // path of the counter 6445 + arg->mpi->iproc, // user-defined value &ProcCounter // counter handle buffer ); status = PdhAddCounter( Query, // handle to the query "\\Memory\\% Committed Bytes In Use", 6441 + arg->mpi->iproc, // user-defined value &MemCounter // counter handle buffer ); /* status = PdhAddCounter( Query, // handle to the query "\\IP\\Datagrams/sec", //Bytes Received/sec 6450 + arg->mpi->iproc, // user-defined value &IPCounter // counter handle buffer ); status = PDH_CSTATUS_NO_OBJECT ;*/ } for (int iRaw= 0; iRaw < TOTAL_PROCESSOR_LOOPS; ++iRaw) { status = PdhCollectQueryData( Query // handle of the query ); status = PdhGetRawCounterValue( ProcCounter, // handle of the counter NULL, // counter type &RawValue[iRaw] // counter value ); status = PdhGetRawCounterValue( MemCounter, // handle of the counter NULL, // counter type &RawValueMemory[iRaw] // counter value ); /* status = PdhGetRawCounterValue( IPCounter, // handle of the counter NULL, // counter type &RawValueIP[iRaw] // counter value );*/ Sleep(100); } status = PdhComputeCounterStatistics( ProcCounter, // handle of the counter PDH_FMT_LONG, // format code 0, // first entry in the array TOTAL_PROCESSOR_LOOPS, // number of entries in the array &RawValue[0], // array of raw counter values &statistics // buffer for counter statistics ); status = PdhComputeCounterStatistics( MemCounter, // handle of the counter PDH_FMT_LONG, // format code 0, // first entry in the array TOTAL_PROCESSOR_LOOPS, // number of entries in the array &RawValueMemory[0], // array of raw counter values &statisticsmemory // buffer for counter statistics ); /* status = PdhComputeCounterStatistics( IPCounter, // handle of the counter PDH_FMT_LONG, // format code 0, // first entry in the array TOTAL_PROCESSOR_LOOPS, // number of entries in the array &RawValueIP[0], // array of raw counter values &statisticsIP // buffer for counter statistics );*/ status = PdhCollectQueryData( Query // handle of the query ); iError = send(sock, (char*)&statistics.mean.longValue, sizeof(LONG), 0); iError = send(sock, (char*)&statisticsmemory.mean.longValue, sizeof(LONG), 0); if (!arg->mpi->iproc) { //CString strTemp; //sprintf(strTemp.GetBuffer(256), "Sent the Processor Data %d, Error : %d", FormatValue.longValue, iError); //strTemp.ReleaseBuffer(); //AfxMessageBox(strTemp); } //sprintf(buffer, "Processor utilization is %d", FormatValue.longValue); /*status = PdhCollectQueryData( Query // handle of the query );*/ } } }