2012-11-05 52 views
1

如何編寫一個程序沒有窗口,沒有窗口類,沒有CPU消耗while循環,沒有控制檯尚未使用消耗循環將消耗更少中央處理器?win32無窗口應用程序使用定時器使用消息循環,而不使用CPU消耗while循環

我在下面解釋我的要求。

我正在寫一個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 ...或事件對象,當且僅當這些可能會消耗更多的資源,只是隱藏窗口,然後請指定,也因此我會去簡單的方法...

據工作

我真的不知道它是如何工作的原因,我讀的人表示將不會運行。 我在網上搜索更多的信息,它一直在努力...... 我不知道。

可以嗎?這是一種合適的方式嗎?困惑。

+0

聽起來像也許這應該是一個服務,而不是一個應用程序? – cbranch

+0

我在做什麼是系統不應該閒置(使用編程,而不是從控制面板中刪除空閒),所以在每30個空閒秒鐘後,計時器調用一個函數,該函數將使用kbd事件來按下一個鍵。有些事情是這樣的......除此之外,學習如何編寫服務也是很好的......我也會嘗試。 –

+0

-1返回值的可能性意味着此類代碼可能會導致致命的應用程序錯誤。相反,請在MSDN上檢查GetMessage: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936.aspx –

回答

3

GetMessage是一個阻塞呼叫,這意味着如果沒有消息可用,它不會返回。如果您有一個隱藏窗口不在接收任何消息,則包含消息循環的線程不會消耗任何CPU資源。您想要處理的一條消息是WM_QUIT,它可以實現乾淨退出。您可以在代碼中的其他地方使用PostMessage自己發佈此消息。

如果以這種方式處理它,則需要在消息循環之前設置其他線程和定時器,因爲一旦GetMessage阻塞,您將無法執行其他任何操作。

+0

哦。瞭解。除此之外,可以通過int main(int argc,char * argv)而不是像WinMain(...)那樣賦予它嗎? –

+0

是的,它的工作方式與我上面提到的一樣。 –