Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Luiz Gustavo Casagrande

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

Recommended Posts

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.

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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!

Compartilhar este post


Link para o post
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")

Editado por cyer
Código para compiladores menos avançados.
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×