#c_sharp #многопоточность
Мне необходимо получать в фоне какая раскладка клавиатуры сейчас активна в системе. Само получение раскладки реализовано так: [DllImport("user32.dll", SetLastError = true)] static extern int GetWindowThreadProcessId( [In] IntPtr hWnd, [Out, Optional] IntPtr lpdwProcessId ); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", SetLastError = true)] static extern ushort GetKeyboardLayout( [In] int idThread ); Непосредственно функция: ushort GetKeyboardLayout() { return GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero)); } Я создал поток такого вида: while (true) { if (GetKeyboardLayout() == 1033) { this.BackgroundImage = bt1; this.notifyIcon1.Icon = WindowsFormsApplication1.Properties.Resources.engico; } else { this.BackgroundImage = bt2; this.notifyIcon1.Icon = WindowsFormsApplication1.Properties.Resources.ruico; } } Собственно запуск потока: Thread thread1 = new Thread(tickness); thread1.IsBackground = true; thread1.Priority = ThreadPriority.Lowest; thread1.Start(); Однако, такая реализация потребляет около 15% CPU и в целом "кушает" очень много. Подскажите, пожалуйста, более экономичный вариант работы потока.
Ответы
Ответ 1
Все правильно, у вас поток постоянно молотит в бесконечном цикле и это отъедает изрядную часть процессорного времени. Таймер и вызов вашего кода, допустим, каждые 100мс определенно понизят нагрузку. Вам нужно решить каков допустимый интервал между сменой раскладки и реакцией программы и использовать его. Без таймера можно на WaitForSingleObject в цикле, если я ничего не путаю. Но это тоже просто задержка, которая не жрет процессор.
Комментариев нет:
Отправить комментарий