File: worker_thread.h

package info (click to toggle)
codelite 6.1.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 48,992 kB
  • ctags: 43,502
  • sloc: cpp: 334,263; ansic: 18,441; xml: 4,713; yacc: 2,653; lex: 2,449; python: 1,188; sh: 385; makefile: 40
file content (131 lines) | stat: -rw-r--r-- 3,793 bytes parent folder | download
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