123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655 |
- #include "StdAfx.h"
- #include "MsgQueue.h"
- #include <iostream>
- //#include "CDInterface.h"
- #include "DiosThread.h"
- //#include "stacktrace.hpp"
- using namespace std;
- DWORD WINAPI Thread_Base::Thread_Base_Thread(LPVOID pPara)
- {
- INT ret = 0;
- int waitevent = 0;
- Thread_Base *handle = (Thread_Base *)pPara;
- //prev work
- Sleep(30);
- if (handle->RegistThread() == false)
- {
- goto endwork_entry;
- }
- if (handle->OnStartThread() == false)
- {
- goto endwork_entry;
- }
- handle->SetThreadOnTheRun(true);//设置线程已经开始工作了
- while (true)
- {
- //do work
- if (handle->Exec() == false)
- {
- break;
- }
- //check exit flag
- waitevent = handle->WaitTheIncommingEvent(0);
- if (waitevent == 0)
- {
- break;
- }
- }
- endwork_entry:
- //end work
- //SetEvent(handle->m_ExitFlag);
- //handle->OnEndThread();
- //handle->UnRegistThread();
- //handle->SetThreadOnTheRun(false);//设置线程已经结束工作了
- handle->ThreadExitProcedure();
- return 0;
- }
- Thread_Base::Thread_Base(void)
- {
- m_Base_Thread = 0;
- m_ThreadID = 0;
- m_pThreadLogger = 0;
- m_ExitFlag = CreateEvent(0, true, false, 0);
- m_WorkFlag = CreateEvent(0, false, false, 0);
- m_RunFlag = CreateEvent(0, true, false, 0);
- }
- Thread_Base::~Thread_Base(void)
- {
- StopThread();
- CloseHandle(m_ExitFlag);
- CloseHandle(m_WorkFlag);
- CloseHandle(m_RunFlag);
- m_ThreadID = 0;
- m_Base_Thread = 0;
- m_pThreadLogger = 0;
- }
- bool Thread_Base::RegistThread()
- {
- return true;
- //return CDInterface::GetCDI()->RegistThread(this);
- }
- bool Thread_Base::UnRegistThread()
- {
- return true;
- //CDInterface::GetCDI()->UnRegistThread(m_ThreadID);
- //return true;
- }
- bool Thread_Base::OnStartThread()
- {
- return true;
- }
- bool Thread_Base::OnEndThread()
- {
- return true;
- }
- bool Thread_Base::Exec()
- {
- return false;
- }
- bool Thread_Base::StartThread(bool Sync,bool Inherit)
- {
- DWORD wait;
- if (m_strName.length() <= 0)
- {
- std::cout << "" << endl;
- }
- //std::cout << "========== Thread_Base::StartThread [" << m_strName.c_str() << "] by TID [" << GetCurrentThreadId() << "]" << endl;
- if (m_Base_Thread)
- {
- wait = WaitForSingleObject(m_Base_Thread, 0);
- if (wait == WAIT_TIMEOUT)
- {
- //already running
- //GPRINTA_ERROR("StartThread Failed. it's in running state");
- std::cout << "StartThread Failed.it's [" << m_strName.c_str() << "] in running state" << endl;
- return true;
- }
- CloseHandle(m_Base_Thread);
- }
- ResetEvent(m_ExitFlag);
- if (Inherit)
- {
- SECURITY_ATTRIBUTES sa = { 0 };
- sa.bInheritHandle = TRUE;
- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
- m_Base_Thread = CreateThread(&sa, 0, Thread_Base_Thread, this, 0, &m_ThreadID);
- }
- else
- {
- m_Base_Thread = CreateThread(0, 0, Thread_Base_Thread, this, 0, &m_ThreadID);
- }
- //create not success, try again.
- if (m_Base_Thread == NULL)
- {
- std::cout << "========== Thread_Base::StartThread [" << m_strName.c_str() << "] failed by [" << GetCurrentThreadId() << "] " << endl;
- //wait for 100 ms
- WaitForSingleObject(m_ExitFlag, 100);
- if (Inherit)
- {
- SECURITY_ATTRIBUTES sa = { 0 };
- sa.bInheritHandle = TRUE;
- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
- m_Base_Thread = CreateThread(&sa, 0, Thread_Base_Thread, this, 0, &m_ThreadID);
- }
- else
- {
- m_Base_Thread = CreateThread(0, 0, Thread_Base_Thread, this, 0, &m_ThreadID);
- }
- }
- if (m_Base_Thread == NULL)
- {
- //GPRINTA_ERROR("CreateThread Failed. ErrorCode:%ld", GetLastError());
- SetEvent(m_ExitFlag);
- printf("CreateThread Failed. [%s] WTF??.ErrCode:%d\n", m_strName.c_str(), GetLastError());
- return false;
- }
- //std::cout << "========== Thread_Base::StartThread [" << m_strName.c_str() << "] succeeded " << GetThreadId(m_Base_Thread) << " by [" << GetCurrentThreadId() << "]" << endl;
- if (Sync)
- {
- //for test
- //return WaitTheThreadOnTheRun(INFINITE);
- return WaitTheThreadOnTheRun(300000);
- }
- return true;
- }
- bool Thread_Base::WaitTheThreadEnd(DWORD waittime)
- {
- bool ret = false;
- if (m_Base_Thread)
- {
- DWORD wait = WaitForSingleObject(m_Base_Thread, waittime);
- if (wait == WAIT_OBJECT_0)
- {
- ret = true;
- }
- }
- else
- {
- ret = true;
- }
- return ret;
- }
- bool Thread_Base::SetThreadOnTheRun(bool OnTheRun)
- {
- if (OnTheRun)
- {
- SetEvent(m_RunFlag);
- }
- else
- {
- ResetEvent(m_RunFlag);
- }
- return true;
- }
- bool Thread_Base::WaitTheThreadOnTheRun(DWORD waittime)
- {
- if (m_Base_Thread)
- {
- DWORD wait = WaitForSingleObject(m_Base_Thread, 0);
- if (wait == WAIT_OBJECT_0)
- {
- //thread already terminated
- //StackTrace st;
- //printf("WaitTheThreadOnTheRun Failed.WTF??\n");
- std::cout << "WaitTheThreadOnTheRun Thread already Exit [" << m_strName.c_str() << "]" << endl;
- return false;
- }
- DWORD dwTick = GetTickCount();
- wait = WaitForSingleObject(m_RunFlag, waittime);
- dwTick = GetTickCount() - dwTick;
- if (wait == WAIT_OBJECT_0)
- {
- std::cout << " WaitTheThreadOnTheRun Wait for Run ok [" << m_strName.c_str() << "] use time [" << dwTick << "ms]" << endl;
- return true;
- }
- std::cout << " WaitTheThreadOnTheRun Wait for Run timeout ["<< m_strName.c_str() << "] use time [" << dwTick << "ms]" << endl;
- }
- else
- {
- std::cout << "WaitTheThreadOnTheRun Failed.no thread exist?? [" << m_strName.c_str() << "]" << endl;
- }
- return false;
- }
- bool Thread_Base::WaitTheThreadEndSign(DWORD waittime)
- {
- if (m_Base_Thread)
- {
- DWORD wait = WaitForSingleObject(m_ExitFlag, waittime);
- if (wait == WAIT_OBJECT_0)
- {
- return true;
- }
- return false;
- }
- return true;
- }
- void Thread_Base::NotifyExit()
- {
- SetEvent(m_ExitFlag);
- }
- bool Thread_Base::StopThread(DWORD timeperiod)
- {
- bool ret = true;
- SetEvent(m_ExitFlag);
- //std::cout << "========== Thread_Base::StopThread ["<< m_strName.c_str() <<"] ThreadID [" << GetThreadId(m_Base_Thread) << "] by [" << GetCurrentThreadId() << endl;
- //me call me
- if (GetTID() == GetCurrentThreadId())
- {
- return true;
- }
- while (m_Base_Thread)
- {
- DWORD wait = WaitForSingleObject(m_Base_Thread, timeperiod);
- if (wait == WAIT_TIMEOUT)
- {
- //printf("Warning!!!!!!\nWarning!!!!!!\nWarning!!!!!!\n StopThread Using Terminate Method\n");
- TerminateThread(m_Base_Thread, 0);
- //if it's Terminated in unknown reason without notice,we need check it out
- //if (WaitTheThreadOnTheRun(1000))
- {
- //Terminated
- ThreadExitProcedure();
- }
- //CloseHandle(m_Base_Thread);
- ret = false;
- }
- else
- {
- CloseHandle(m_Base_Thread);
- }
- m_Base_Thread = NULL;
- }
- m_ThreadID = 0;
- return ret;
- }
- DWORD Thread_Base::GetTID()
- {
- return m_ThreadID;
- }
- void Thread_Base::NotifyThreadWork()
- {
- SetEvent(m_WorkFlag);
- }
- void Thread_Base::SetName(const char* pszThreadName)
- {
- m_strName = pszThreadName;
- }
- INT Thread_Base::WaitTheIncommingEvent(DWORD waittime)
- {
- HANDLE waits[2] = { m_ExitFlag, m_WorkFlag };
- if (m_Base_Thread)
- {
- DWORD wait = WaitForMultipleObjects(2, waits, false, waittime);
- if (wait == WAIT_OBJECT_0)
- {
- return 0;
- }
- else if (wait == WAIT_OBJECT_0 + 1)
- {
- return 1;
- }
- else
- {
- //timeout
- return -1;
- }
- }
- //WTF??
- //treat it as exist thread
- return 0;
- }
- void Thread_Base::SetLogger(PVOID pLoger)
- {
- m_pThreadLogger = pLoger;
- }
- PVOID Thread_Base::GetLogger()
- {
- return m_pThreadLogger;
- }
- void Thread_Base::ThreadExitProcedure()
- {
- SetEvent(m_ExitFlag);
- OnEndThread();
- UnRegistThread();
- SetThreadOnTheRun(false);//设置线程已经结束工作了
- //CloseHandle(m_Base_Thread);
- }
- HANDLE Thread_Base::GetWorkEvt()
- {
- return m_WorkFlag;
- }
- HANDLE Thread_Base::GetExitEvt()
- {
- return m_ExitFlag;
- }
- //------------------------work thread--------------------------------------
- Work_Thread::Work_Thread(void)
- {
- MsgQueue<ResDataObject> *p;
- p = new MsgQueue<ResDataObject>;
- m_pWorkQueReq = (HANDLE)p;
- p = new MsgQueue<ResDataObject>;
- m_pWorkQueRes = (HANDLE)p;
- m_PauseEvt = CreateEvent(0, TRUE, 0, 0);
- m_ResumeEvt = CreateEvent(0, TRUE, 0, 0);
- m_SleepingEvt = CreateEvent(0, TRUE, 0, 0);
- m_WorkingEvt = CreateEvent(0, TRUE, 0, 0);//初始状态就是FINISH
- }
- Work_Thread::~Work_Thread(void)
- {
- MsgQueue<ResDataObject> *p;
- p = (MsgQueue<ResDataObject> *)m_pWorkQueReq;
- delete p;
- m_pWorkQueReq = NULL;
- p = (MsgQueue<ResDataObject> *)m_pWorkQueRes;
- delete p;
- m_pWorkQueRes = NULL;
- CloseHandle(m_PauseEvt);
- m_PauseEvt = NULL;
- CloseHandle(m_SleepingEvt);
- m_SleepingEvt = NULL;
- CloseHandle(m_ResumeEvt);
- m_ResumeEvt = NULL;
- CloseHandle(m_WorkingEvt);
- m_WorkingEvt = NULL;
- }
- bool Work_Thread::PopReqDataObject(ResDataObject &obj)
- {
- return (bool)((MsgQueue<ResDataObject> *)m_pWorkQueReq)->DeQueue(obj);
- }
- bool Work_Thread::PushReqDataObject(ResDataObject &obj)
- {
- if (WaitTheThreadEndSign(0))
- {
- return false;//not possible to send it
- }
- //printf("Thread:%d,push REQ one\n", GetCurrentThreadId());
- ((MsgQueue<ResDataObject> *)m_pWorkQueReq)->InQueue(obj);
- NotifyThreadWork();
- return true;
- }
- bool Work_Thread::PopResDataObject(ResDataObject &obj)
- {
- //printf("Thread:%d,Pop Res one\n", GetCurrentThreadId());
- return (bool)((MsgQueue<ResDataObject> *)m_pWorkQueRes)->DeQueue(obj);
- }
- bool Work_Thread::PushResDataObject(ResDataObject &obj)
- {
- if (WaitTheThreadEndSign(0))
- {
- return false;//not possible to send it
- }
- //printf("Thread:%d,push Res one\n",GetCurrentThreadId());
- ((MsgQueue<ResDataObject> *)m_pWorkQueRes)->InQueue(obj);
- NotifyThreadWork();
- return true;
- }
- bool Work_Thread::WaitForInQue(DWORD m_Timeout)
- {
- HANDLE wait[5] = { m_ExitFlag, m_PauseEvt, m_WorkFlag ,0,0};
- wait[3] = ((MsgQueue<ResDataObject> *)m_pWorkQueReq)->GetNotifyHandle();
- wait[4] = ((MsgQueue<ResDataObject> *)m_pWorkQueRes)->GetNotifyHandle();
- DWORD ret = WaitForMultipleObjects(5,wait,0, 0);
- if ((ret >= WAIT_OBJECT_0) && (ret <= WAIT_OBJECT_0 + 1))
- {
- return false;
- }
- if (((MsgQueue<ResDataObject> *)m_pWorkQueReq)->WaitForInQue(0) == WAIT_OBJECT_0)
- {
- return true;
- }
- if (((MsgQueue<ResDataObject> *)m_pWorkQueRes)->WaitForInQue(0) == WAIT_OBJECT_0)
- {
- return true;
- }
-
- ret = WaitForMultipleObjects(5, wait, FALSE, m_Timeout);
- if ((ret >= WAIT_OBJECT_0 + 2) && (ret < (WAIT_OBJECT_0 + 5)))
- {
- return true;
- }
- return false;
- }
- //finished=No,Pause=Yes,Others=No
- //only Pause=Yes
- bool Work_Thread::CheckForPause()
- {
- DWORD retEvt = 0;
- bool ret = false;
- HANDLE waitExp[2] = { m_ExitFlag, m_PauseEvt };
- retEvt = WaitForMultipleObjects(2, waitExp, FALSE, 0);
- if (retEvt == WAIT_OBJECT_0 + 1)
- {
- ResetEvent(m_WorkingEvt);
- SetEvent(m_SleepingEvt);
- ret = true;
- }
- return ret;
- }
- //only Resume=Yes
- bool Work_Thread::WaitforResume()
- {
- bool Exret = false;
- HANDLE wait[2] = { m_ExitFlag, m_ResumeEvt };
- DWORD ret = 0;
- ret = WaitForMultipleObjects(2, wait, FALSE, INFINITE);
- if (ret == WAIT_OBJECT_0 + 1)
- {
- //拿到Resume
- ResetEvent(m_SleepingEvt);
- SetEvent(m_WorkingEvt);
- Exret = true;
- }
- return Exret;
- }
- bool Work_Thread::PauseThread(DWORD timeout)
- {
- bool ret = false;
- DWORD retEvt = 0;
- HANDLE wait[2] = { m_ExitFlag, m_SleepingEvt };
- if (GetCurrentThreadId() == m_ThreadID)
- {
- return false;
- }
- if (WaitTheThreadOnTheRun(0) == false)
- {
- //thread is not running
- return false;
- }
- SetEvent(m_PauseEvt);
- //get response
- retEvt = WaitForMultipleObjects(2, wait, FALSE, timeout);
- if (retEvt == WAIT_OBJECT_0 + 1)
- {
- ret = true;
- }
- ResetEvent(m_PauseEvt);
- return ret;
- }
- bool Work_Thread::ResumeThread(DWORD timeout)
- {
- bool ret = 0;
- DWORD retEvt = 0;
- HANDLE wait[3] = { m_ExitFlag, m_WorkingEvt };
- if (GetCurrentThreadId() == m_ThreadID)
- {
- return false;
- }
- if (WaitTheThreadOnTheRun(0) == false)
- {
- //thread is not running
- return false;
- }
- SetEvent(m_ResumeEvt);
- retEvt = WaitForMultipleObjects(2, wait, FALSE, timeout);
- if (retEvt == WAIT_OBJECT_0 + 1)
- {
- ret = true;
- }
- ResetEvent(m_ResumeEvt);
- return ret;
- }
- //------------------------dios thread--------------------------------------
- Dios_Thread::Dios_Thread(void)
- {
- }
- Dios_Thread::~Dios_Thread(void)
- {
- }
|