static DWORD WINAPI MyThread( LPVOID lpThreadParameter ){ Impl *This = (Impl*)lpThreadParameter; DWORD threadidx = GetCurrentThreadId(); while (!This->m_exit){ if (WAIT_OBJECT_0 == This->m_queueSemaphore.WaitAndDec(1000)) { std::shared_ptr<MyTaskData> task; task = This->getTaskAndPop(threadidx); assert(task); // run task->Run(); } } return 0; }