Реферат: Эффективная многопоточность
dbIdleTime = GetCPUUsage();
}
return dbIdleTime;
}
// Возвращает true, если поток имеет незавершенные операции ввода/вывода
bool HasThreadIoPending(HANDLE hThread = GetCurrentThread())
{
typedef NTSTATUS (NTAPI ZwQueryInformationThread_t)(
IN HANDLE ThreadHandle,
IN NT::THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
static ZwQueryInformationThread_t* ZwQueryInformationThread = 0;
if(!ZwQueryInformationThread)
{
ZwQueryInformationThread = (ZwQueryInformationThread_t*)GetProcAddress(
GetModuleHandle(_T("ntdll.dll")), _T("NtQueryInformationThread"));
}
ULONG io = 0;
ZwQueryInformationThread(hThread, NT::ThreadIsIoPending, &io, 4, 0);
return io > 0;
}
// Возвращает количество необработанных запросов в очереди порта
DWORD GetIoCompletionLen(HANDLE hIoPort)
{
typedef NTSTATUS (NTAPI ZwQueryIoCompletion_t)(
IN HANDLE IoCompletionHandle,