]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/thread.h
Small changes after Robert's edits
[wxWidgets.git] / include / wx / thread.h
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: thread.h
3// Purpose: Thread API
4// Author: Guilhem Lavaux
5// Modified by:
6// Created: 04/13/98
7// RCS-ID: $Id$
8// Copyright: (c) Guilhem Lavaux
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_THREADH__
13#define _WX_THREADH__
14
15#ifdef __GNUG__
16#pragma interface "thread.h"
17#endif
18
19#include "wx/object.h"
20#include "wx/setup.h"
21
22typedef enum {
23 MUTEX_NO_ERROR=0,
24 MUTEX_DEAD_LOCK, // Mutex has been already locked by THE CALLING thread
25 MUTEX_BUSY, // Mutex has been already locked by ONE thread
26 MUTEX_UNLOCKED
27} wxMutexError;
28
29typedef enum {
30 THREAD_NO_ERROR=0, // No error
31 THREAD_NO_RESOURCE, // No resource left to create a new thread
32 THREAD_RUNNING, // The thread is already running
33 THREAD_NOT_RUNNING // The thread isn't running
34} wxThreadError;
35
36// defines the interval of priority.
37#define WXTHREAD_MIN_PRIORITY 0
38#define WXTHREAD_DEFAULT_PRIORITY 50
39#define WXTHREAD_MAX_PRIORITY 100
40
41// ---------------------------------------------------------------------------
42// Mutex handler
43class wxMutexInternal;
44class WXDLLEXPORT wxMutex {
45public:
46 // constructor & destructor
47 wxMutex();
48 ~wxMutex();
49
50 // Lock the mutex.
51 wxMutexError Lock();
52 // Try to lock the mutex: if it can't, returns immediately with an error.
53 wxMutexError TryLock();
54 // Unlock the mutex.
55 wxMutexError Unlock();
56
57 // Returns true if the mutex is locked.
58 bool IsLocked() const { return (m_locked > 0); }
59protected:
60 friend class wxCondition;
61
62 int m_locked;
63 wxMutexInternal *p_internal;
64};
65
66// ---------------------------------------------------------------------------
67// Condition handler.
68class wxConditionInternal;
69class WXDLLEXPORT wxCondition {
70public:
71 // constructor & destructor
72 wxCondition();
73 ~wxCondition();
74
75 // Waits indefinitely.
76 void Wait(wxMutex& mutex);
77 // Waits until a signal is raised or the timeout is elapsed.
78 bool Wait(wxMutex& mutex, unsigned long sec, unsigned long nsec);
79 // Raises a signal: only one "Waiter" is released.
80 void Signal();
81 // Broadcasts to all "Waiters".
82 void Broadcast();
83private:
84 wxConditionInternal *p_internal;
85};
86
87// ---------------------------------------------------------------------------
88// Thread management class
89class wxThreadInternal;
90class WXDLLEXPORT wxThread {
91public:
92 // constructor & destructor.
93 wxThread();
94 virtual ~wxThread();
95
96 // Create a new thread, this method should check there is only one thread
97 // running by object.
98 wxThreadError Create();
99
100 // Destroys the thread immediately if the defer flag isn't true.
101 wxThreadError Destroy();
102
103 // Switches on the defer flag.
104 void DeferDestroy(bool on);
105
106 // Waits for the termination of the thread.
107 void *Join();
108
109 // Sets the priority to "prio". (Warning: The priority can only be set before
110 // the thread is created)
111 void SetPriority(int prio);
112 // Get the current priority.
113 int GetPriority() const;
114
115 // Get the thread ID
116 unsigned long GetID() const;
117
118 // Returns true if the thread is alive.
119 bool IsAlive() const;
120 // Returns true if the thread is the main thread (aka the GUI thread).
121 static bool IsMain();
122
123 // Called when thread exits.
124 virtual void OnExit();
125protected:
126 // In case, the DIFFER flag is true, enables another thread to kill this one.
127 void TestDestroy();
128 // Exits from the current thread.
129 void Exit(void *status = NULL);
130private:
131 // Entry point for the thread.
132 virtual void *Entry() = 0;
133
134private:
135 friend class wxThreadInternal;
136
137 wxThreadInternal *p_internal;
138};
139
140// ---------------------------------------------------------------------------
141// Global variables
142
143// GUI mutex.
144WXDLLEXPORT_DATA(extern wxMutex) wxMainMutex;
145
146#endif