Страница 1 из 5

Разработка программы диспетчеризации запуска приложений С++

Добавлено: 27 ноя 2015, 19:09
DimonLimon
Помогите пожалуйста, суть в том что нужно сделать программу которая в определённое время (например в 14:33) запустит любой файл или программу... вот что я сделал

Код: Выделить всё

#include "stdafx.h" 

#include <iostream> 
#include <conio.h>
#include <process.h>
#include <time.h>

using namespace std;

int main(int argc, int *argv[])
{
	
	time_t seconds = time(NULL);
	tm* timeinfo = localtime(&seconds);
	char* format = "%H:%M";
	char buffer[80];
	strftime(buffer, 80, format, timeinfo);
	cout << "Current Datetime: " << buffer << endl;

	execl("c:\\WINDOWS\\system32\\notepad.exe", "c:\\WINDOWS\\system32\\notepad.exe", NULL);	

	return 0;
}
тут выводиться системное время и сразу запускается блокнот...

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 27 ноя 2015, 19:19
Absurd

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 27 ноя 2015, 19:31
DimonLimon
Зачем мне это мне нужно программу написать а не в самой виндовс задавать расписание запуска программ..

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 27 ноя 2015, 20:12
Absurd
Зачем мне это мне нужно программу написать а не в самой виндовс задавать расписание запуска программ..
Зачем писать код который уже написан? Если в целях обучения, то это тривиально. Берешь вычисляешь timestamp (при помощи mktime) времени запуска, спишь при помощи std::this_thread::sleep_until() где параметр получается из time_t при помощи std::chrono::system_clock::from_time_t()), потом запускаешь программу. Если пишешь нечто типа crond, то используешь очередь с приоритетами (std :: priority_queue), где приоритет - время запуска. Проверяешь время запуска задачи в голове очереди, и дальше спишь пока время не наступит, потом запускаешь. Если задача одноразовая, то выкидываешь ее из очереди после запуска, если периодическая, то вычисляешь время следующего запуска и помещаешь обратно в очередь.

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 28 ноя 2015, 12:56
DimonLimon
мне нужно самому написать программу...мне помогут?

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 28 ноя 2015, 13:59
Romeo
DimonLimon писал(а):мне нужно самому написать программу...мне помогут?
Тебе же Absurd накидал примерный план работ.

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 28 ноя 2015, 16:39
Decoder
Готовых планировщиков задач существует большое количество.
Но если браться самому за написание подобной программы, то необходимо будет изучить основы многопоточного программирования.
Основой таких программ является таймер, который срабатывает через заданные интервалы времени.
Тебе нужно будет написать функцию, которая будет циклически с интервалом в одну секунду получать локальное время и сравнивать его с заданным. Выдержка нужных интервалов времени обеспечивается именно таймером.
Когда оба этих значения сравняются, произойдёт запуск указанного приложения.
Но эта функция должна работать асинхронно, т.е. выполняться в отдельном потоке, чтобы не блокировать основной.

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 28 ноя 2015, 18:40
Сионист
Я проверял время в бесконечном цикле во вторичном потоке. Таймерные сообщения ни как не использовались ни для какой выдержки интервалов между вызовами функции текущего времени. Более того, при таком подходе вообще нельзя надеяться на выдержку стабильных, или хотябы приблизительно стабильных интервалов.

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 28 ноя 2015, 19:10
Absurd
Сионист писал(а):Я проверял время в бесконечном цикле во вторичном потоке.
Thread yield делал-то хотябы иногда или просто так грел одно из ядер?
Сионист писал(а):
Таймерные сообщения ни как не использовались ни для какой выдержки интервалов между вызовами функции текущего времени.
Какие таймерные сообщения? WM_TIMER чтоли? О них речь не шла.
Сионист писал(а):
Более того, при таком подходе вообще нельзя надеяться на выдержку стабильных, или хотябы приблизительно стабильных интервалов.
Ванильные Винда и Линукс вообще не реалтаймовые ОС. Нужен реалтайм - покупай PLC и щелкай в ней герконами. Но crond который не съедает целиком одно ядро люди как-то пишут.

Re: Разработка программы диспетчеризации запуска приложений С++

Добавлено: 28 ноя 2015, 19:27
Сионист
Absurd писал(а):Thread yield делал-то хотябы иногда
Я даже не знаю, что это такое.
Absurd писал(а):или просто так грел одно из ядер
Оно там всего одно.
Absurd писал(а):WM_TIMER чтоли? О них речь не шла.
Вот же:
Decoder писал(а):Выдержка нужных интервалов времени обеспечивается именно таймером.
. Так что не надо.
Absurd писал(а):Но crond который не съедает целиком одно ядро люди как-то пишут.
Кто такой?
Absurd писал(а):Ванильные Винда и Линукс вообще не реалтаймовые ОС.
Слово "приблизительно" знакомо? Чем надежда от гарантии отличается знаешь?
Absurd писал(а):Нужен реалтайм - покупай PLC и щелкай в ней герконами.
Есть ещё фотон. Это виндоусподобная (внешне) ОС реального времени.