Безоконное приложение win32, использующее таймер с использованием цикла сообщений и без использования циклов, потребляющих процессор

Как написать программу без окна, без класса окна, без циклов while, потребляющих процессор, без консоли, но с использованием цикла сообщений, который будет потреблять меньше процессора?

Я объясняю свои требования ниже.

Я пишу программу API win32, которая использует таймер и не нуждается в окне.

  1. Согласно руководствам, цикл сообщений по умолчанию запускается только в том случае, если с ним связано окно.

  2. Я просмотрел другое содержимое stackoverflow, в котором четко указано, что следует предотвращать циклы while и функции сна, которые вызовут слишком большую нагрузку на процессор.

  3. Я хочу запустить эту программу как фоновую программу без окна.

  4. Я использую функцию обратного вызова в качестве последнего параметра для функции setTimer, поэтому мне не нужно иметь оконную процедуру.

  5. Я слышал о событиях/объектах, используемых в цикле сообщений по умолчанию, который будет поддерживать работу программы, но не будет перегружать процессор. это единственный способ? но я не знаю, как использовать эту опцию.

Каковы все возможные способы написать такое приложение без затрат ЦП и других ресурсов?

Ваши предложения и ссылки действительно помогут.

Вот код, который у меня есть сейчас, который выйдет, потому что окна не связаны, как сказано в других обсуждениях.

#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... или объекты событий, тогда и только тогда, когда они могут потреблять больше ресурсов, которые просто скрывают окно, пожалуйста, укажите это также, потому что я выберу этот простой способ ...

Он работает

Мне действительно интересно, как это работает, потому что я читал, что люди говорят, что это не работает. Я искал в сети дополнительную информацию, и это сработало... Я не знаю.

Это нормально? это правильный путь? смущенный.


person Jayapal Chandran    schedule 05.11.2012    source источник
comment
Похоже, это должна быть служба, а не приложение?   -  person cbranch    schedule 05.11.2012
comment
что я делаю, так это то, что система не должна простаивать (используя программирование, а не удаляя бездействие с панели управления), поэтому через каждые 30 секунд простоя таймер вызывает функцию, которая будет использовать событие kbd для нажатия клавиши ... некоторые что-то вроде этого... кроме того, было бы неплохо научиться писать сервисы... я тоже попробую это.   -  person Jayapal Chandran    schedule 05.11.2012
comment
Возможность возврата значения -1 означает, что такой код может привести к фатальным ошибкам приложения. Вместо этого проверьте GetMessage в MSDN: msdn.microsoft.com/en -us/library/windows/desktop/ms644936.aspx   -  person CS.    schedule 03.06.2013
comment
(TIMERPROC) getidle потенциально является неопределенным поведением, см. приведение указателя функции к другому типу   -  person user    schedule 21.10.2014


Ответы (1)


GetMessage — это блокирующий вызов, что означает, что если нет доступных сообщений, он не возвращается. Если у вас есть скрытое окно, которое не может получать какие-либо сообщения, поток, содержащий цикл сообщений, не потребляет никаких ресурсов ЦП. Единственное сообщение, которое вы хотите обработать, — это WM_QUIT, которое обеспечивает чистый выход. Вы можете опубликовать это сообщение самостоятельно с помощью PostMessage в другом месте вашего кода.

Если вы подойдете к этому таким образом, вам нужно будет настроить другие потоки и таймеры перед циклом сообщений, потому что после того, как GetMessage заблокируется, вы не сможете делать что-либо еще.

person eh9    schedule 05.11.2012
comment
ой. понял. кроме того, можно ли использовать int main(int argc, char * argv) вместо того, что я дал, как WinMain(...)? - person Jayapal Chandran; 09.11.2012