Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct TASK_DATA
- {
- LONG _dwTaskCount, _dwRefCount, _dwReadyCount;
- HANDLE _hEvent[2];
- ULONG _iLoop;
- bool _bExit;
- TASK_DATA() : _dwRefCount(1), _dwTaskCount(0), _hEvent{}, _bExit(false), _dwReadyCount(0), _iLoop(0) {}
- ~TASK_DATA() {
- if (_hEvent[1]) CloseHandle(_hEvent[1]);
- if (_hEvent[0]) CloseHandle(_hEvent[0]);
- }
- void AddRef()
- {
- InterlockedIncrementNoFence(&_dwRefCount);
- }
- void Release()
- {
- if (!InterlockedDecrement(&_dwRefCount))
- {
- delete this;
- }
- }
- ULONG Start(ULONG i)
- {
- ULONG n = 0;
- if ((_hEvent[0] = CreateEvent(0, TRUE, FALSE, 0)) &&
- (_hEvent[1] = CreateEvent(0, TRUE, FALSE, 0)))
- {
- do
- {
- n += AddThread();
- } while (--i);
- }
- if (n)
- {
- SetEvent(_hEvent[0]);
- }
- return n;
- }
- ULONG AddThread()
- {
- AddRef();
- if (HANDLE hThread = CreateThread(0, 0, s_CalcThread, this, 0, 0))
- {
- _dwTaskCount++;
- CloseHandle(hThread);
- return 1;
- }
- Release();
- return 0;
- }
- void EndTask(bool bReadyForNewTask)
- {
- if (bReadyForNewTask)
- {
- InterlockedIncrementNoFence(&_dwReadyCount);
- }
- if (!InterlockedDecrement(&_dwTaskCount))
- {
- MessageBoxW(0, L"do some calc synthesis stuff.", L"", MB_ICONWARNING);
- if (_dwTaskCount = _dwReadyCount)
- {
- _dwReadyCount = 0;
- ResetEvent(_hEvent[_iLoop]);
- SetEvent(_hEvent[_iLoop = 1 - _iLoop]);
- }
- }
- }
- void CalcThread()
- {
- bool bReadyForNewTask = true;
- WCHAR sz[64], wz[64];
- swprintf_s(wz, L"[%x]", GetCurrentThreadId());
- int i = 1, j = 0;
- do
- {
- if (WaitForSingleObject(_hEvent[i = 1 - i], INFINITE) == WAIT_OBJECT_0 && !_bExit)
- {
- swprintf_s(sz, L"do some calc stuff #%u", j++);
- MessageBoxW(0, sz, wz, MB_ICONINFORMATION);
- }
- else
- {
- bReadyForNewTask = false;
- }
- EndTask(bReadyForNewTask);
- } while (bReadyForNewTask);
- Release();
- }
- static ULONG WINAPI s_CalcThread(void* This)
- {
- reinterpret_cast<TASK_DATA*>(This)->CalcThread();
- return 0;
- }
- };
- void demo()
- {
- if (TASK_DATA* p = new TASK_DATA)
- {
- if (p->Start(3))
- {
- MessageBoxW(0, L"Task Start", 0, MB_ICONWARNING);
- p->_bExit = true;
- }
- p->Release();
- MessageBoxW(0, L"Task End", 0, MB_ICONWARNING);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement