У меня есть приложение 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. Любая помощь приветствуется.