【问题标题】:win32 windowless application using timer using message loop and without using cpu consuming while loopswin32 无窗口应用程序使用定时器使用消息循环并且不使用 CPU 消耗 while 循环
【发布时间】:2012-10-25 08:18:56
【问题描述】:

如何编写一个没有窗口、没有窗口类、没有 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... 或事件对象,当且仅当这些可以消耗更多资源而只是隐藏窗口时,请指定这也是因为我将使用这么简单的方法……

它正在工作

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

没事吧?这是正确的方法吗?困惑。

【问题讨论】:

  • 听起来应该是服务而不是应用程序?
  • 我正在做的是系统不应该空闲(使用编程而不是通过从控制面板中删除空闲)所以每 30 秒空闲后计时器调用一个函数,该函数将使用 kbd 事件按下一个键......像这样的东西......此外,学习如何编写服务也很好......我也会尝试。
  • 返回值 -1 的可能性意味着此类代码可能导致致命的应用程序错误。相反,请查看 MSDN 上的 GetMessage:msdn.microsoft.com/en-us/library/windows/desktop/ms644936.aspx
  • (TIMERPROC) getidle 可能是未定义的行为,请参阅Casting a function pointer to another type

标签: winapi windowless


【解决方案1】:

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

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

【讨论】:

  • 哦。明白了。此外,可以使用 int main(int argc, char * argv) 而不是我给出的 WinMain(...) 吗?
猜你喜欢
  • 2012-07-20
  • 2021-04-14
  • 1970-01-01
  • 2018-01-06
  • 2012-09-25
  • 2012-05-26
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多