#c #windows
#c #Windows #c
Вопрос:
В ситуации, с которой я столкнулся, мне нужен некоторый код на C , который будет выполнять команду каждые 2 часа, хотя я не программирую на C (скорее C #), но в данном случае я не могу использовать C #.
Не мог бы кто-нибудь предоставить пример кода, который демонстрирует это, пожалуйста
Комментарии:
1. @DeadMG Windows, но планировщик задач в этом случае не подходит
2. @David Heffernan Не могли бы вы уточнить, я ничего не могу найти об этом
3.msdn.microsoft.com/en-us/library/ms632592 (v = против 85).aspx , msdn.microsoft.com/en-us/library/ms644906 (v = против 85).aspx
Ответ №1:
Возможно, что-то простое вроде этого?:
VOID WINAPI Sleep(
__in DWORD dwMilliseconds
);
.
while (true)
{
dosmt();
sleep(2*60*60*1000);
}
Или запустить его в одном потоке на случай, если он должен выполняться параллельно с оставшейся программой? В этом случае boost::thread может помочь.
Ответ №2:
стандартные библиотеки c не предоставляют никаких опций, похожих на таймеры c #, вы можете использовать режим ожидания, но это приведет к приостановке потока,
Не очень точным обходным путем будет получение времени из clock при инициализации,
и помещает проверку в некоторый регулярно выполняемый блок, чтобы увидеть, соответствует ли time> init step, а затем перейти к вашим инструкциям timer и сбросить init = cur_time..
или вы можете использовать таймер Windows :
http://www.cplusplus.com/forum/beginner/11271 / http://www.cplusplus.com/forum/windows/5531/
Ответ №3:
Используйте мастер обслуживания C для создания службы и подключите это к службе (с большим количеством ошибок, конечно). Это должно работать с большинством современных версий Windows.
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
/**
A callback function. It is similar to a delegate in .Net.
*/
VOID CALLBACK theTimerCallback(PVOID aParam, BOOLEAN TimerOrWaitFired)
{
// This is executed when the timer fires.
cout << "The timer says: Hello, world." << endl;
// The parameter (see below) is a handle to single the
// main thread to shut down.
HANDLE theShutdownEvent = (HANDLE)aParam;
// Tell the main thread to shutdown.
SetEvent (theShutdownEvent);
}
int _tmain(int argc, _TCHAR* argv[])
{
// Assuming you have a program running some main thread, this
// will run a timer in the background and handle the timer callbacks.
// So if this is a service, this timer would execute while the main
// service thread can handle startup and shutdown of the service.
// If it is just a single thread of an application that you manually
// execute, then using a sleep in a loop would work fine.
// Creating an event to make this main thread wait.
HANDLE anEventHandle = CreateEvent (NULL, TRUE, FALSE, L"Shutdown event");
// The queue object that handles the timers
HANDLE theTimerQueueHandle = CreateTimerQueue ();
HANDLE theTimerHandle = NULL;
if (CreateTimerQueueTimer (
amp;theTimerHandle, // The handle to the timer is written to this variable.
theTimerQueueHandle, // The handle to the timer queue that tracks this timer.
theTimerCallback, // The callback function (see above).
anEventHandle, // A parameter sent to the callback function. This can be anything.
10000, // Time to fire, in milliseconds (10 secs).
0, // Execution period - 0 means it only fires once.
WT_EXECUTEDEFAULT // Look at the API docs and pick your own flags.
) )
{
cout << "Main thread waiting for timer." << endl;
// This makes the main thread wait until the timer fires. Normally, something like
// a service would have its own mechanism of waiting on the main thread.
WaitForSingleObject (anEventHandle, INFINITE);
// This shuts down all the timers, deletes their handles, waits for
// handler functions to finish, and deletes the timer handles as well
// as the queue handle.
DeleteTimerQueueEx (theTimerQueueHandle, INVALID_HANDLE_VALUE);
}
CloseHandle (anEventHandle);
cout << "Main thread exiting" << endl;
return 0;
}