Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 4.91 KB | None | 0 0
  1. diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
  2. index a719e72..9750f95 100644
  3. --- a/src/corelib/kernel/qeventdispatcher_win.cpp
  4. +++ b/src/corelib/kernel/qeventdispatcher_win.cpp
  5. @@ -84,7 +84,8 @@ extern uint qGlobalPostedEventsCount();
  6.  
  7.  enum {
  8.      WM_QT_SOCKETNOTIFIER = WM_USER,
  9. -    WM_QT_SENDPOSTEDEVENTS = WM_USER + 1
  10. +    WM_QT_SENDPOSTEDEVENTS = WM_USER + 1,
  11. +    SendPostedEventsWindowsTimerId = ~1u
  12.  };
  13.  
  14.  #if defined(Q_OS_WINCE)
  15. @@ -353,7 +354,7 @@ public:
  16.  
  17.      // for controlling when to send posted events
  18.      QAtomicInt serialNumber;
  19. -    int lastSerialNumber;
  20. +    int lastSerialNumber, sendPostedEventsWindowsTimerId;
  21.      QAtomicInt wakeUps;
  22.  
  23.      // timers
  24. @@ -378,7 +379,7 @@ public:
  25.  
  26.  QEventDispatcherWin32Private::QEventDispatcherWin32Private()
  27.      : threadId(GetCurrentThreadId()), interrupt(false), internalHwnd(0), getMessageHook(0),
  28. -      serialNumber(0), lastSerialNumber(0), wakeUps(0)
  29. +      serialNumber(0), lastSerialNumber(0), sendPostedEventsWindowsTimerId(0), wakeUps(0)
  30.  {
  31.      resolveTimerAPI();
  32.  }
  33. @@ -485,17 +486,22 @@ LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPA
  34.              }
  35.          }
  36.          return 0;
  37. -    } else if (message == WM_TIMER) {    
  38. -        Q_ASSERT(d != 0);
  39. -        d->sendTimerEvent(wp);
  40. -        return 0;
  41. -    } else if (message == WM_QT_SENDPOSTEDEVENTS) {
  42. +    } else if (message == WM_QT_SENDPOSTEDEVENTS
  43. +               // we also use a Windows timer to send posted events when the message queue is full
  44. +               || (message == WM_TIMER
  45. +                   && d
  46. +                   && d->sendPostedEventsWindowsTimerId != 0
  47. +                   && wp == d->sendPostedEventsWindowsTimerId)) {
  48.          int localSerialNumber = d->serialNumber;
  49.          if (localSerialNumber != d->lastSerialNumber) {
  50.              d->lastSerialNumber = localSerialNumber;
  51.              QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);
  52.          }
  53.          return 0;
  54. +    } else if (message == WM_TIMER) {
  55. +        Q_ASSERT(d != 0);
  56. +        d->sendTimerEvent(wp);
  57. +        return 0;
  58.      }
  59.  
  60.      return DefWindowProc(hwnd, message, wp, lp);
  61. @@ -507,21 +513,35 @@ LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp)
  62.          QEventDispatcherWin32 *q = qobject_cast<QEventDispatcherWin32 *>(QAbstractEventDispatcher::instance());
  63.          Q_ASSERT(q != 0);
  64.          if (q) {
  65. +            MSG *msg = (MSG *) lp;
  66.              QEventDispatcherWin32Private *d = q->d_func();
  67.              int localSerialNumber = d->serialNumber;
  68. -            MSG unused;
  69. -            if ((HIWORD(GetQueueStatus(QS_INPUT | QS_RAWINPUT)) == 0
  70. -                 && PeekMessage(&unused, 0, WM_TIMER, WM_TIMER, PM_NOREMOVE) == 0)) {
  71. -                // no more input or timer events in the message queue or more than 10ms has elapsed since
  72. -                // we send posted events, we can allow posted events to be sent now
  73. +            if (HIWORD(GetQueueStatus(QS_TIMER | QS_INPUT | QS_RAWINPUT)) == 0) {
  74. +                // no more input or timer events in the message queue, we can allow posted events to be sent normally now
  75. +                if (d->sendPostedEventsWindowsTimerId != 0) {
  76. +                    // stop the timer to send posted events, we now allow the WM_QT_SENDPOSTEDEVENTS message
  77. +                    KillTimer(d->internalHwnd, d->sendPostedEventsWindowsTimerId);
  78. +                    d->sendPostedEventsWindowsTimerId = 0;
  79. +                }
  80.                  (void) d->wakeUps.fetchAndStoreRelease(0);
  81. -                MSG *msg = (MSG *) lp;
  82.                  if (localSerialNumber != d->lastSerialNumber
  83.                      // if this message IS the one that triggers sendPostedEvents(), no need to post it again
  84.                      && (msg->hwnd != d->internalHwnd
  85.                          || msg->message != WM_QT_SENDPOSTEDEVENTS)) {
  86.                      PostMessage(d->internalHwnd, WM_QT_SENDPOSTEDEVENTS, 0, 0);
  87.                  }
  88. +            } else if (d->sendPostedEventsWindowsTimerId == 0
  89. +                       && localSerialNumber != d->lastSerialNumber
  90. +                       // if this message IS the one that triggers sendPostedEvents(), no need to post it again
  91. +                       && (msg->hwnd != d->internalHwnd
  92. +                           || msg->message != WM_QT_SENDPOSTEDEVENTS)) {
  93. +
  94. +                // start a special timer to continue delivering posted events while
  95. +                // there are still input and timer messages in the message queue
  96. +                d->sendPostedEventsWindowsTimerId = SetTimer(d->internalHwnd,
  97. +                                                             SendPostedEventsWindowsTimerId,
  98. +                                                             USER_TIMER_MINIMUM,
  99. +                                                             NULL);
  100.              }
  101.          }
  102.      }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement