Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Поток потребляет очень много ресурсов C#

#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 в цикле, если я ничего не путаю. Но это тоже просто задержка, которая не жрет процессор.

Комментариев нет:

Отправить комментарий