#pragma once class SDRThreadTask { public: enum SDR_COMMAND { SDR_THREAD_EXIT=wxID_EXIT, SDR_THREAD_NULL=wxID_HIGHEST+1, SDR_THREAD_STARTED, SDR_THREAD_PROCESS, SDR_THREAD_ERROR, }; SDRThreadTask() : m_cmd(eID_THREAD_NULL) {} SDRThreadTask(SDR_COMMAND cmd, const wxString& arg) : m_cmd(cmd), m_Arg(arg) {} SDR_COMMAND m_cmd; wxString m_Arg; }; class SDRThreadQueue { public: enum SDR_PRIORITY { SDR_PRIORITY_HIGHEST, SDR_PRIORITY_HIGHER, SDR_PRIORITY_NORMAL, SDR_PRIORITY_BELOW_NORMAL, SDR_PRIORITY_LOW, SDR_PRIORITY_IDLE }; SDRThreadQueue(wxEvtHandler* pParent) : m_pParent(pParent) {} void AddTask(const SDRThreadTask& task, const SDR_PRIORITY& priority=SDR_PRIORITY_NORMAL) { wxMutexLocker lock(m_MutexQueue); m_Tasks.insert(std::make_pair(priority, task)); m_QueueCount.Post(); } SDRThreadTask Pop() { SDRThreadTask element; m_QueueCount.Wait(); m_MutexQueue.Lock(); element=(m_Tasks.begin())->second; m_Tasks.erase(m_Tasks.begin()); m_MutexQueue.Unlock(); return element; } void Report(const SDRThreadTask::SDR_COMMAND& cmd, const wxString& sArg=wxEmptyString, int iArg=0) { wxCommandEvent evt(wxEVT_THREAD, cmd); evt.SetString(sArg); evt.SetInt(iArg); m_pParent->AddPendingEvent(evt); } size_t Stacksize() { wxMutexLocker lock(m_MutexQueue); return m_Tasks.size(); } private: wxEvtHandler* m_pParent; std::multimap m_Tasks; wxMutex m_MutexQueue; wxSemaphore m_QueueCount; };