0

我有一个 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() 将在后台运行,但仍然响应,因为它需要突袭显示在标准输入上的任何数据。任何帮助表示赞赏。

4

0 回答 0