summaryrefslogtreecommitdiff
path: root/Client/Source/Threading/WorkThread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Client/Source/Threading/WorkThread.cpp')
-rw-r--r--Client/Source/Threading/WorkThread.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/Client/Source/Threading/WorkThread.cpp b/Client/Source/Threading/WorkThread.cpp
new file mode 100644
index 0000000..4ea6262
--- /dev/null
+++ b/Client/Source/Threading/WorkThread.cpp
@@ -0,0 +1,50 @@
+#include "Thread.h"
+
+#include "../Debug/Log.h"
+
+void WorkThread::Run()
+{
+ while (true)
+ {
+ Lock(m_PendingMutex)
+ {
+ for (auto iter = m_PendingJobs.begin(); iter != m_PendingJobs.end();)
+ {
+ Job* job = *iter;
+ job->Process();
+ if (job->IsFinished())
+ {
+ Lock(m_FinishedMutex) {
+ m_FinishedJobs.push_back(job);
+ }
+ iter = m_PendingJobs.erase(iter);
+ continue;
+ }
+ ++iter;
+ }
+ if (m_PendingJobs.size() == 0)
+ ::Sleep(100);
+ }
+ }
+}
+
+void WorkThread::Dispatch(void* param)
+{
+ Lock(m_FinishedMutex)
+ {
+ for (int i = 0; i < m_FinishedJobs.size(); ++i)
+ {
+ m_FinishedJobs[i]->Dispacth(param);
+ delete m_FinishedJobs[i];
+ }
+ m_FinishedJobs.clear();
+ }
+}
+
+void WorkThread::AddJobAtEnd(Job* job)
+{
+ Lock(m_PendingMutex)
+ {
+ m_PendingJobs.push_back(job);
+ }
+} \ No newline at end of file