我有一个 Windows 应用程序,它只是在后台运行,并通过一个单独的线程不断监视出现在标准输入上的数据。它这样做是因为它是一个 Chrome 原生消息传递主机,这就是它与浏览器扩展程序通信的方式(正如RobW 在这个 SO 问题中所阐明的那样)。它似乎运行良好,尽管 imo 在没有活动时使用了太多的 cpu。当浏览器扩展在标准输入上向我的应用程序发送字节时,必须立即发现并处理它,并且由于处理密集,对 cpu 使用的需求增加是可以理解的,但在没有活动时似乎不应该使用太多。
免责声明:我不会称自己为经验丰富的 Windows 开发人员。
我正在使用 _beginThreadEx() 启动从标准输入不断读取的函数。线程是在 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;
}
任务管理器显示 CPU 使用率约为 49%。我假设 _beginThreadEx() 将在后台运行,但仍然响应,因为它需要突袭显示在标准输入上的任何数据。任何帮助表示赞赏。