blob: 1642f88d53124949bcc753a27c4f6935a6a71104 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright : (C) 2008 by Eran Ifrah
// file name : worker_thread.cpp
//
// -------------------------------------------------------------------------
// A
// _____ _ _ _ _
// / __ \ | | | | (_) |
// | / \/ ___ __| | ___| | _| |_ ___
// | | / _ \ / _ |/ _ \ | | | __/ _ )
// | \__/\ (_) | (_| | __/ |___| | || __/
// \____/\___/ \__,_|\___\_____/_|\__\___|
//
// F i l e
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#include "worker_thread.h"
WorkerThread::WorkerThread()
: wxThread(wxTHREAD_JOINABLE)
, m_notifiedWindow( NULL )
, m_sleep(200)
{
}
WorkerThread::~WorkerThread()
{
if( !m_queue.empty() ){
std::deque<ThreadRequest*>::iterator iter = m_queue.begin();
for(; iter != m_queue.end(); iter++){
delete (*iter);
}
m_queue.clear();
}
}
void* WorkerThread::Entry()
{
while( true )
{
// Did we get a request to terminate?
if(TestDestroy())
break;
ThreadRequest *request = GetRequest();
if( request )
{
// Call user's implementation for processing request
ProcessRequest( request );
delete request;
wxThread::Sleep(10); // Allow other threads to work as well
request = NULL;
continue; // to avoid the sleep
}
// Sleep for 1 seconds, and then try again
wxThread::Sleep(m_sleep);
}
return NULL;
}
void WorkerThread::Add(ThreadRequest *request)
{
wxCriticalSectionLocker locker(m_cs);
m_queue.push_back(request);
}
ThreadRequest *WorkerThread::GetRequest()
{
wxCriticalSectionLocker locker(m_cs);
ThreadRequest *req = NULL;
if( !m_queue.empty() ){
req = m_queue.front();
m_queue.pop_front();
}
return req;
}
void WorkerThread::Stop()
{
#if wxVERSION_NUMBER < 2904
if(IsAlive()) {
Delete();
}
Wait();
#else
// Notify the thread to exit and
// wait for it
if ( IsAlive() ) {
Delete(NULL, wxTHREAD_WAIT_BLOCK);
} else {
Wait(wxTHREAD_WAIT_BLOCK);
}
#endif
}
void WorkerThread::Start(int priority)
{
Create();
SetPriority(priority);
Run();
}
void WorkerThread::SetSleepInterval(size_t ms)
{
m_sleep = ms;
}
|