patch 8.1.1975: MS-Windows GUI responds slowly to timer

Problem:    MS-Windows GUI responds slowly to timer.
Solution:   Break out of wait loop when timer was added or input is available.
            (closes #4893)
This commit is contained in:
Bram Moolenaar 2019-09-04 13:53:21 +02:00
parent 1f3165bc34
commit 89c0003331
2 changed files with 19 additions and 15 deletions

View File

@ -2074,7 +2074,7 @@ gui_mch_wait_for_chars(int wtime)
focus = gui.in_focus;
while (!s_timed_out)
{
/* Stop or start blinking when focus changes */
// Stop or start blinking when focus changes
if (gui.in_focus != focus)
{
if (gui.in_focus)
@ -2094,29 +2094,31 @@ gui_mch_wait_for_chars(int wtime)
did_add_timer = FALSE;
#endif
#ifdef MESSAGE_QUEUE
/* Check channel I/O while waiting for a message. */
// Check channel I/O while waiting for a message.
for (;;)
{
MSG msg;
parse_queued_messages();
#ifdef FEAT_TIMERS
if (did_add_timer)
break;
#endif
if (pPeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
process_message();
break;
}
else if (MsgWaitForMultipleObjects(0, NULL, FALSE, 100, QS_ALLINPUT)
!= WAIT_TIMEOUT)
else if (input_available()
|| MsgWaitForMultipleObjects(0, NULL, FALSE, 100,
QS_ALLINPUT) != WAIT_TIMEOUT)
break;
}
#else
/*
* Don't use gui_mch_update() because then we will spin-lock until a
* char arrives, instead we use GetMessage() to hang until an
* event arrives. No need to check for input_buf_full because we are
* returning as soon as it contains a single char -- webb
*/
// Don't use gui_mch_update() because then we will spin-lock until a
// char arrives, instead we use GetMessage() to hang until an
// event arrives. No need to check for input_buf_full because we are
// returning as soon as it contains a single char -- webb
process_message();
#endif
@ -2125,9 +2127,9 @@ gui_mch_wait_for_chars(int wtime)
remove_any_timer();
allow_scrollbar = FALSE;
/* Clear pending mouse button, the release event may have been
* taken by the dialog window. But don't do this when getting
* focus, we need the mouse-up event then. */
// Clear pending mouse button, the release event may have been
// taken by the dialog window. But don't do this when getting
// focus, we need the mouse-up event then.
if (!s_getting_focus)
s_button_pending = -1;
@ -2137,7 +2139,7 @@ gui_mch_wait_for_chars(int wtime)
#ifdef FEAT_TIMERS
if (did_add_timer)
{
/* Need to recompute the waiting time. */
// Need to recompute the waiting time.
remove_any_timer();
break;
}

View File

@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1975,
/**/
1974,
/**/