File: msgqueue.h

package info (click to toggle)
wxwidgets3.0 3.0.2%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 120,808 kB
  • ctags: 118,010
  • sloc: cpp: 889,420; makefile: 52,980; ansic: 21,933; sh: 5,603; python: 2,935; xml: 1,534; perl: 281
file content (111 lines) | stat: -rw-r--r-- 3,166 bytes parent folder | download | duplicates (14)
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
/////////////////////////////////////////////////////////////////////////////
// Name:        wx/msgqueue.h
// Purpose:     interface of wxMessageQueue<T>
// Author:      wxWidgets team
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

/**
    Error codes for wxMessageQueue<> operations.

    This enum contains the possible return value of wxMessageQueue<> methods.

    @since 2.9.0
    @category{threading}
 */
enum wxMessageQueueError
{
    /// Indicates that the operation completed successfully.
    wxMSGQUEUE_NO_ERROR = 0,

    /**
        Indicates that no messages were received before timeout expired.

        This return value is only used by wxMessageQueue<>::ReceiveTimeout().
     */
    wxMSGQUEUE_TIMEOUT,

    /// Some unexpected (and fatal) error has occurred.
    wxMSGQUEUE_MISC_ERROR
};

/**
    wxMessageQueue allows passing messages between threads.

    This class should be typically used to communicate between the main and worker
    threads. The main thread calls wxMessageQueue::Post and the worker thread
    calls wxMessageQueue::Receive.

    @tparam T
        For this class a message is an object of arbitrary type T.

    Notice that often there is a some special message indicating that the thread
    should terminate as there is no other way to gracefully shutdown a thread
    waiting on the message queue.

    @since 2.9.0

    @nolibrary
    @category{threading}

    @see wxThread
*/
template <typename T>
class wxMessageQueue<T>
{
public:
    /**
        Default and only constructor.
        Use wxMessageQueue::IsOk to check if the object was successfully initialized.
    */
    wxMessageQueue();

    /**
        Remove all messages from the queue.

        This method is meant to be called from the same thread(s) that call
        Post() to discard any still pending requests if they became
        unnecessary.

        @since 2.9.1
     */
    wxMessageQueueError Clear();

    /**
        Returns @true if the object had been initialized successfully, @false
        if an error occurred.
    */
    bool IsOk() const;

    /**
        Add a message to this queue and signal the threads waiting for messages
        (i.e. the threads which called wxMessageQueue::Receive or
        wxMessageQueue::ReceiveTimeout).

        This method is safe to call from multiple threads in parallel.
    */
    wxMessageQueueError Post(T const& msg);

    /**
        Block until a message becomes available in the queue.
        Waits indefinitely long or until an error occurs.

        The message is returned in @a msg.
    */
    wxMessageQueueError Receive(T& msg);

    /**
        Block until a message becomes available in the queue, but no more than
        @a timeout milliseconds has elapsed.

        If no message is available after @a timeout milliseconds then returns
        @b wxMSGQUEUE_TIMEOUT.

        If @a timeout is 0 then checks for any messages present in the queue
        and returns immediately without waiting.

        The message is returned in @a msg.
    */
    wxMessageQueueError ReceiveTimeout(long timeout, T& msg);
};