【发布时间】:2012-10-25 08:18:56
【问题描述】:
如何编写一个没有窗口、没有窗口类、没有 cpu 消耗 while 循环、没有控制台还使用消息循环的程序,这将消耗更少的 cpu?
我在下面解释我的要求。
我正在写一个win32 api程序,它使用定时器并且不需要窗口。
根据手册,默认消息循环仅在有与之关联的窗口时才会运行。
我浏览了其他 stackoverflow 内容,其中明确指出要防止 while 循环和睡眠功能导致 CPU 负载过大。
我想像后台程序一样运行这个程序,没有窗口。
我使用回调函数作为 setTimer 函数的最后一个参数,因此我不必有窗口过程。
我听说在默认消息循环中使用的事件/对象将保持程序运行但不会使 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