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 121 122 123 124 125 126 127 128 129 130 131
|
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright : (C) 2008 by Eran Ifrah
// file name : worker_thread.h
//
// -------------------------------------------------------------------------
// 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.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#ifndef WORKER_THREAD_H
#define WORKER_THREAD_H
#include <deque>
#include "wx/thread.h"
#include "wx/event.h"
#include "codelite_exports.h"
/**
* Base class for thread requests,
*/
class WXDLLIMPEXP_CL ThreadRequest
{
public:
ThreadRequest() {};
virtual ~ThreadRequest() {};
};
/**
* Worker Thread class
* usually user should define the ProcessRequest method
*/
class WXDLLIMPEXP_CL WorkerThread : public wxThread
{
protected:
wxCriticalSection m_cs;
wxEvtHandler * m_notifiedWindow;
std::deque<ThreadRequest*> m_queue;
size_t m_sleep;
public:
/**
* @brief set the sleep interval. If non is set, 200ms is the default
*/
void SetSleepInterval(size_t ms);
/**
* Default constructor.
*/
WorkerThread();
/**
* Destructor.
*/
virtual ~WorkerThread();
/**
* Thread execution point.
*/
virtual void *Entry();
/**
* Called when the thread exits
* whether it terminates normally or is stopped with Delete() (but not when it is Kill()'ed!)
*/
virtual void OnExit() {};
/**
* Add a request to the worker thread
* \param request request to execute.
*/
void Add(ThreadRequest *request);
/**
* Set the window to be notified when a change was done
* between current source file tree and the actual tree.
* \param evtHandler
*/
void SetNotifyWindow( wxEvtHandler* evtHandler ) {
m_notifiedWindow = evtHandler;
}
wxEvtHandler* GetNotifiedWindow() {
return m_notifiedWindow;
}
/**
* Stops the thread
* This function returns only when the thread is terminated.
* \note This call must be called from the context of other thread (e.g. main thread)
*/
void Stop();
/**
* Start the thread as joinable thread.
* \note This call must be called from the context of other thread (e.g. main thread)
*/
void Start(int priority = WXTHREAD_DEFAULT_PRIORITY);
/**
* Process request from the other thread
* \param request ThreadRequest object to process
*/
virtual void ProcessRequest(ThreadRequest *request) = 0;
protected:
/**
* Get next request from queue.
* \param file [output] source file that was updated
* \param project [output] project name where file belongs to
* \param dbfile [output] dataabase file name
* \return true if there is a request to process
*/
ThreadRequest* GetRequest();
};
#endif // WORKER_THREAD_H
|