The threadpool has a generic wait on an handle (eg. event, process, etc.) mechanism. It even has a timeout so say you want to wait either for an event or a timeout, but the timeout is in FILETIME format. How do you convert a specified amount say in ms of time into a FILETIME?
HRESULT DoWaitWithTimeout(
__in DWORD Timeout) // in ms
{
HRESULT hr = S_OK;
PMY_CONTEXT pContext = NULL;
FILETIME timeout = {0};
pContext = (PMY_CONTEXT)my_alloc(sizeof(MY_CONTEXT));
if (!pContext) {
hr = E_OUTOFMEMORY;
goto Exit;
}
ZeroMemory(pContext, sizeof(MY_CONTEXT));
pContext->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!pContext->hEvent) {
hr = HRESULT_FROM_WIN32(GetLastError());
goto Exit;
}
pContext->hWait = CreateThreadpoolWait(
MyWaitCallback,
pContext,
NULL);
if (!pContext->hWait) {
hr = HRESULT_FROM_WIN32(GetLastError());
goto Exit;
}
if (Timeout) {
ULARGE_INTEGER ulTimeout = {0};
// Timeout in ms, FILETIME is in 100 ns increments
ulTimeout.QuadPart = Timeout * -10000;
timeout.dwHighDateTime = ulTimeout.HighPart;
timeout.dwLowDateTime = ulTimeout.LowPart;
}
SetThreadpoolWait(
pContext->hWait,
pContext->hEvent,
&timeout);
// ...

No comments:
Post a Comment