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
50
51
52
53
54
55
56
57
58
59
60
61
64
65
67QWinEventNotifier::QWinEventNotifier(QObject *parent)
68 : QObject(*
new QWinEventNotifierPrivate, parent)
72
73
74
75
76
77
78
79
80
82QWinEventNotifier::QWinEventNotifier(HANDLE hEvent, QObject *parent)
83 : QObject(*
new QWinEventNotifierPrivate(hEvent,
false), parent)
89
90
92QWinEventNotifier::~QWinEventNotifier()
98
99
100
101
102
103
104
105
107void QWinEventNotifier::setHandle(HANDLE hEvent)
109 Q_D(QWinEventNotifier);
111 d->handleToEvent = hEvent;
115
116
117
118
120HANDLE QWinEventNotifier::handle()
const
122 Q_D(
const QWinEventNotifier);
123 return d->handleToEvent;
127
128
129
130
132bool QWinEventNotifier::isEnabled()
const
134 Q_D(
const QWinEventNotifier);
139
140
141
142
143
145void QWinEventNotifier::setEnabled(
bool enable)
147 Q_D(QWinEventNotifier);
148 if (d->enabled == enable)
152 if (Q_UNLIKELY(thread() != QThread::currentThread())) {
153 qWarning(
"QWinEventNotifier: Event notifiers cannot be enabled or disabled from another thread");
161 d->winEventActPosted.testAndSetRelaxed(QWinEventNotifierPrivate::Posted,
162 QWinEventNotifierPrivate::IgnorePosted);
165 Q_ASSERT(!d->registered);
166 SetThreadpoolWait(d->waitObject, d->handleToEvent, NULL);
167 d->registered =
true;
168 }
else if (d->registered) {
171 SetThreadpoolWait(d->waitObject, NULL, NULL);
175 WaitForThreadpoolWaitCallbacks(d->waitObject, TRUE);
176 d->registered =
false;
181
182
184bool QWinEventNotifier::event(QEvent * e)
186 Q_D(QWinEventNotifier);
189 case QEvent::ThreadChange:
191 QMetaObject::invokeMethod(
this,
"setEnabled", Qt::QueuedConnection,
196 case QEvent::WinEventAct:
200 if (d->winEventActPosted.fetchAndStoreRelaxed(QWinEventNotifierPrivate::NotPosted)
201 == QWinEventNotifierPrivate::Posted && d->enabled) {
204 d->registered =
false;
206 QPointer<QWinEventNotifier> alive(
this);
207 emit activated(d->handleToEvent, QPrivateSignal());
209 if (alive && d->enabled && !d->registered) {
210 SetThreadpoolWait(d->waitObject, d->handleToEvent, NULL);
211 d->registered =
true;
218 return QObject::event(e);
221QWinEventNotifierPrivate::QWinEventNotifierPrivate(HANDLE h,
bool e)
222 : handleToEvent(h), enabled(e), registered(
false)
224 waitObject = CreateThreadpoolWait(waitCallback,
this, NULL);
225 if (waitObject == NULL)
226 qErrnoWarning(
"QWinEventNotifier:: CreateThreadpollWait failed.");
229QWinEventNotifierPrivate::~QWinEventNotifierPrivate()
231 CloseThreadpoolWait(waitObject);
234void QWinEventNotifierPrivate::waitCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
235 PTP_WAIT wait, TP_WAIT_RESULT waitResult)
239 Q_UNUSED(waitResult);
240 QWinEventNotifierPrivate *nd =
reinterpret_cast<QWinEventNotifierPrivate *>(context);
244 if (nd->winEventActPosted.fetchAndStoreRelaxed(QWinEventNotifierPrivate::Posted)
245 == QWinEventNotifierPrivate::NotPosted) {
246 QCoreApplication::postEvent(nd->q_func(),
new QEvent(QEvent::WinEventAct));
252#include "moc_qwineventnotifier.cpp"