Как минимизировать использование процессора в потоке, созданном _beginThreadEx? - PullRequest
0 голосов
/ 30 января 2020

У меня есть приложение Windows, которое просто работает в фоновом режиме и постоянно следит за данными, появляющимися на stdin, с помощью отдельного потока. Это происходит потому, что это Chrome собственный узел обмена сообщениями, и именно так он и должен взаимодействовать с расширением браузера (как поясняется в этом вопросе от RobW ). Кажется, он работает нормально, хотя, по его мнению, он использует слишком много процессора, когда нет активности. Когда расширение браузера отправляет байты на stdin в мое приложение, оно должно быть обнаружено и обработано немедленно, и поскольку обработка интенсивна, повышенный спрос на использование процессора понятен, но, похоже, он не должен использовать много, когда нет активности.

Отказ от ответственности: я бы не назвал себя опытным Windows разработчиком.

Я использую _beginThreadEx () для запуска функции, которая постоянно читает из stdin. Поток создается в InitInstance () примерно так:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   int nStdInDescriptor = _fileno(stdin);
   hStdIn = (HANDLE) _get_osfhandle(nStdInDescriptor);

   OutputDebugStringA("starting message processing thread function");
   hReadInputThread = (HANDLE)_beginthreadex(0, 0, &threadfunc_processMessages, &i, 0, 0);

   hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd && !hReadInputThread)
   {
      return FALSE;
   }

   hMainWnd = hWnd;

   return TRUE;
}

и

unsigned int __stdcall threadfunc_processMessages(void* data)
{
    char buffer_temp[STDIN_BUF_SIZE];
    buffer_main = NULL;

    DWORD dwNumBytesRead;
    DWORD dwNumBytesToRead = STDIN_BUF_SIZE;

    while (1) {

        if (ReadFile(hStdIn, buffer_temp, dwNumBytesToRead, &dwNumBytesRead, NULL)) {
            OutputDebugStringA( "Found some bytes on stdin" );

            // byte processing code here. it always processes normally
        }
    }

    return 0;
}

Диспетчер задач показывает, что загрузка процессора составляет около 49%. Я предполагал, что _beginThreadEx () будет работать в фоновом режиме, но все же будет отзывчивым, поскольку ему нужно наброситься на любые данные, которые отображаются на stdin. Любая помощь приветствуется.

...