1

如何编写一个没有窗口、没有窗口类、没有 cpu 消耗 while 循环、还没有控制台使用会消耗更少 cpu 的消息循环的程序?

我在下面解释我的要求。

我正在编写一个使用计时器且不需要窗口的 win32 api 程序。

  1. 根据手册,默认消息循环仅在有与之关联的窗口时运行。

  2. 我浏览了其他 stackoverflow 内容,其中明确指出要防止 while 循环和睡眠功能会导致 CPU 负载过大。

  3. 我想像没有窗口的后台程序一样运行这个程序。

  4. 我使用回调函数作为 setTimer 函数的最后一个参数,所以我不必有窗口过程。

  5. 我听说在默认消息循环中使用的事件/对象将保持程序运行但不会使 cpu 过载。这是唯一的方法吗?但我不知道如何使用这个选项。

在不消耗 CPU 和其他资源的情况下编写此类应用程序的所有可能方法是什么?

您的建议和参考确实会有所帮助。

这是我现在拥有的代码,它将退出,因为正如其他讨论所述,没有关联任何窗口。

#include <windows.h>

void getidle();

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{

    SetTimer(NULL, 1, 5000, (TIMERPROC) getidle);
    MSG msg;


    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

void getidle()
{
  //some code here
}

所以我需要使用不同类型的消息循环,我不知道如何使用它。类似 MsgWaitForMultipleObjects 或 WaitForSingleObject 的东西。? .

此外,通过执行上面提到的方式,如 msgwait...waitforsigle... 或事件对象,当且仅当这些可以消耗更多仅隐藏窗口的资源时,请指定这也是因为我将采用这种简单的方式...

这是工作

我真的很想知道它是如何工作的,因为我读到人们说它不会运行。我在网上搜索更多信息,它一直在工作......我不知道。

可以吗?这是正确的方法吗?使困惑。

4

1 回答 1

3

GetMessage是一个阻塞调用,这意味着如果没有可用的消息,它不会返回。如果您有一个隐藏窗口不接收任何消息,则包含消息循环的线程不会消耗任何 CPU 资源。您要处理的一条消息是 WM_QUIT,它启用干净的退出。您可以自己PostMessage在代码中的其他位置发布此消息。

如果以这种方式处理它,则需要在消息循环之前设置其他线程和计时器,因为一旦GetMessage阻塞,您将无法执行任何其他操作。

于 2012-11-05T14:04:50.350 回答