Ir ao conteúdo
  • Cadastre-se

C++ Variavel para executar uma ação em algum horário do dia


Posts recomendados

E aí, queria saber como posso programar alguma ação para alguma hora do dia.

Por exemplo, um código que todo dia as 8, 12, 18, 22 horas toque um barulho, despertador, por exemplo. (não necessariamente essa ação mas que todo dia no mesmo horário execute uma ação)

 

Alguém pode me ajudar?

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

Não precisa fazer um programa para isso, o windows ja tem um, se chama "tarefas agendadas do windows".

A API do windows se não me engano tem umas funções para configurar o tarefas agendadas do windows, mas não sei lhe dizer nada sobre o assunto.

De uma olhada aqui: https://msdn.microsoft.com/en-us/library/aa383614(VS.85).aspx

 

Parece algo muito complexo, se não vai ser algo imprescindível melhor não perder tempo com isso.

Para fazer um programa a mão você deveria ter o programa executando-se em um laço infinito, comparando o tempo atual com os que estivessem programados, isso implica em algo que vai lhe "reduzir" o rendimento da sua maquina, pois seria um programa que estaria todo o tempo funcionando, por isso lhe recomendo não fazer nada parecido e sim usar o "Task Scheduler" do windows. O melhor seria investigar como programar o Task Scheduler desde c++ através da API do Windows, que se bem diria que faz a mesma coisa, porém fará de forma otimizada.

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, vangodp disse:

Não precisa fazer um programa para isso, o windows ja tem um, se chama "tarefas agendadas do windows".

A API do windows se não me engano tem umas funções para configurar o tarefas agendadas do windows, mas não sei lhe dizer nada sobre o assunto.

De uma olhada aqui: https://msdn.microsoft.com/en-us/library/aa383614(VS.85).aspx

 

Parece algo muito complexo, se não vai ser algo imprescindível melhor não perder tempo com isso.

Para fazer um programa a mão você deveria ter o programa executando-se em um laço infinito, comparando o tempo atual com os que estivessem programados, isso implica em algo que vai lhe "reduzir" o rendimento da sua maquina, pois seria um programa que estaria todo o tempo funcionando, por isso lhe recomendo não fazer nada parecido e sim usar o "Task Scheduler" do windows. O melhor seria investigar como programar o Task Scheduler desde c++ através da API do Windows, que se bem diria que faz a mesma coisa, porém fará de forma otimizada.

Desculpa, não especifiquei, estou querendo fazer isso em c++ !!!

Obrigado

Link para o comentário
Compartilhar em outros sites

E aí, tudo bem?

Não manjo muito de C++, então levaria horas pra montar o código pra ti, mas, posso te ajudar com a lógica do problema, assim talvez tu consiga solucionar.

 

O que tu precisa fazer é criar um laço inifito - algo como um while(true) - e dentro dele obter a hora atual do sistema. Tendo a hora atual do sistema tu precisa fazer outro laço - dessa vez não inifito - do tipo for ou foreach; esse laço segundo laço deve percorrer a lista de horários "à despertar" (tenho em mente que os horários devam ficar em um array) e verificar se o horário atual é igual ao que está na lista. Se for o caso, você pode fazer uma segunda função de despertar. 

 

Se tiver dúvidas, juntei algum conteúdo que pode ser útil:


Abraços!

Link para o comentário
Compartilhar em outros sites

Bom, tava com pouco tempo, então escrevi o código meio que nas "coxas", então me perdoe pelo código um pouco sujo.

 

A desvantagem que o programa precisa está rodando para executar tal tarefa.

#include <iostream>                      // std::cout
#include <Windows.h>                     // CreateThread, Sleep
#include <map>                           // std::map
#include <string>                        // std::string

struct tarefa
{
    int horas, minutos, segundos;
    int dia, mes, ano;

    tarefa() :
        horas(0), minutos(0), segundos(0),
        dia(0), mes(0), ano(0)
    {
    }

    tarefa(int _horas, int _minutos, int _segundos, int _dia, int _mes, int _ano) :
        horas(_horas), minutos(_minutos), segundos(_segundos),
        dia(_dia), mes(_mes), ano(_ano)
    {
    }
};

std::map<std::string, tarefa> tarefas;

inline bool esta_na_hora(std::string nome_tarefa, tm* tminfo)
{
    return (tminfo->tm_hour == tarefas[nome_tarefa].horas && tminfo->tm_min == tarefas[nome_tarefa].minutos && tminfo->tm_sec == tarefas[nome_tarefa].segundos &&
            tminfo->tm_mday == tarefas[nome_tarefa].dia && tminfo->tm_mon == (tarefas[nome_tarefa].mes - 1) && tminfo->tm_year == (tarefas[nome_tarefa].ano + 1900));
}

inline void adicionar_tarefa(std::string nome_tarefa, int dia, int mes, int ano, int horas, int minutos, int segundos)
{
    tarefas[nome_tarefa].dia = dia;
    tarefas[nome_tarefa].mes = mes;
    tarefas[nome_tarefa].ano = ano;
    tarefas[nome_tarefa].horas = horas;
    tarefas[nome_tarefa].minutos = minutos;
    tarefas[nome_tarefa].segundos = segundos;
}

DWORD WINAPI Thread(LPVOID)
{
    time_t curtime = 0;
    tm* timeinfo = { 0 };

    adicionar_tarefa("Tarefa teste 1", 3, 1, 2018, 17, 49, 30); // Tarefa vai ser executada no dia 3/1/2018 ás 17:49:30
    adicionar_tarefa("Tarefa teste 2", 3, 1, 2018, 17, 49, 40); // Tarefa vai ser executada no dia 3/1/2018 ás 17:49:40

    while (1)
    {
        time(&curtime);
        timeinfo = localtime(&curtime);

        for (std::map<std::string, tarefa>::iterator it = tarefas.begin(); it != tarefas.end(); ++it)
        {
            if (esta_na_hora(it->first, timeinfo))
            {
                std::cout << "Está na hora da tarefa: " << it->first << std::endl;
            }
        }
        Sleep(100); // Pausa para diminuir o uso da cpu
    }
    return 0;
}

int main()
{
    HANDLE th = CreateThread(NULL, NULL, &Thread, NULL, NULL, NULL);
    WaitForSingleObject(th, INFINITE);

    return 0;
}

Código compilado utilizando o Visual Studio 2017 e CodeBlocks(Necessita marcar a opção "Have g++ follow the coming C++0x (aka c++11) ISO C++ language standard [-std=c++0x]", para marcar é só clicar no botão localizado na barra superior da sua tela com o nome "Settings" e depois clicar na opção "Compiler")

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...