Llamar a una funcion cada x segundos – c++ hilos

Pregunta:


Estoy haciendo una aplicacion de consola en VS2008. Tengo una funcion que tengo que llamarla cada 5 segundos, pero hasta que pasen esos 5 segundos el programa tiene que seguir corriendo. He probado a usar thread, pero no puedo incluirlo porque mi version de c++ es antigua. He tomado otro camino y consigo llamar a la funcion cada 5 segundos pero mientras el codigo no se ejecuta. Gracias de antemano.

void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime){cout <<"Hello";}

int _tmain(){
MSG msg;
SetTimer(NULL, 0, 100*60,(TIMERPROC) &f);
while(GetMessage(&msg, NULL, 0, 0)) 
{
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}
//mas codigo a ejecutar pero que no consigo...
return 0;}

Al final he conseguido solucionar el problema de este modo:

DWORD WINAPI solo_thread(void* arg){
int Counter = 0;
printf( "In second thread...n" );

while ( true )
{
    if(Counter<10)
    {
        Counter++;
        Sleep(1000);
    }
    else 
    {
        printf( "Han pasado 10 segundos; Counter:-> %dn", Counter );
        funcionalarm();
        Counter = 0;
    }

}

return 0;}

int _tmain(){
int x=0;
HANDLE hThread;
while (true)
{
    printf( "Creating second thread...n" );
    hThread = CreateThread(NULL, 0, solo_thread,NULL ,0, NULL);
    //WaitForSingleObject( hThread, INFINITE );
    CloseHandle( hThread );
    while (x<10)
    {
        cout <<x;
        x=x+1;
        Sleep(1000);
    }
    x=0;    
}

Sleep(6000);
return 0;}

Preguntado por: Andermutu

eferion

Si no puedes usar la librería thread entonces puedes optar por recurrir a alguna librería que te proporcione una implementación equivalente (por ejemplo Qt o boost) o bien puedes pegarte directamente con la API de Windows.

Yo te recomiendo la primera opción ya que programar sobre WinAPI suele acabar en constantes dolores de cabeza.

Un posible ejemplo con boost:

#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <iostream>

void thread()
{
  try
  {
    while( true )
    {
      funcionALlamarCada5Segundos();
      boost::this_thread::sleep_for(boost::chrono::seconds{5});
    }
  }

  catch( boost::thread_interrupted const& )
  { }
}

int main()
{
  boost::thread t{thread};

  // tu codigo aqui

  // Finalizamos el hilo
  t.interrupt();
  t.join();
}

Fuente

Related Posts:

Declarar un array de structs de tamaño dinamico – c++
Pregunta: buenas, lo que quiero conseguir es declarar un struct con array que tenga su tamaño dinamico, pero cuando lo hago el programa se me ...
Problemas con el registro de un archivo .tlb – c# windows vb6
Pregunta: La situación es la siguiente: He creado un pequeño proyecto de librería de clases en C# que me permita realizar ciertas operaciones. El nombre del ...
Uso de js y c# en unity. ¿Igual rendimiento? – javascript c# unity3d
Pregunta: Estoy comenzando con unity . Y veo que se pueden usar c# y js para programar. Mi pregunta es si tanto c# como js ...
Cómo puedo incluir librería beecrypt en un proyecto en C – c
Pregunta: Tengo un archivo .lib (librería) y quiero usarla en un proyecto de C. Para ser más especifica estoy intentando instalar beecrypt que es una librería ...
Ocultar y Mostrar con Mapa de Google – javascript c# asp.net
Pregunta: Tengo un div en mi página ASP.NET que contiene un Mapa de Google, y necesito mostrarlo y ocultarlo pero no me funciona. Este es el ...
para que sirve #ifdef_MSDOS_ en c++? – c++
Pregunta: He tenido problemas porque donde trabajo usan una versión de dev c++ 4.9 y yo uso en mi hogar la 5.1, ...
¿Como instalar C# en SublimeText? – c# sublimetext3 sublimetext
Pregunta: El problema es que actualmente quiero programar sobre esta tecnologia, pero no quiero descargar aun el visual studio porque consume recursos y es bastante ...
Thread en c++ error compilacion – c++
Pregunta: Estoy empezando con threads y he estado siguien varios tutos y creo que esta todo bien, pero a la hora de ejecutarlo me da ...
¿Es posible capturar un segfault con try/catch? – c++ try-catch
Pregunta: Para comprobar si es posible hice lo siguiente: try { int *x = 0; *x = 1234; } catch(...) { ...
Conexion C# con PostgreSQL mediante proveedor Npgsql – c# postgresql
Pregunta: Hola el problema es que la conexión esta bien solo cuando estoy utilizando el ODBC, pero cuando lo cambio al proveedor de PostgreSQL Npgsql, ...
Construcción extraña: objeto = funcion1() && funcion2() ¿Posible? – c#
Pregunta: acabo de encontrarme en una documentación una construcción como esta: var pose = Body.LeftHand.Near(Body.Head) && Body.LeftArm.Bended(90); posees una objeto que debe crearse a partir de la ...
Cómo importar datos de un Excel a DataGrid pero iniciarlo en la segunda fila? – c# sql-server postgresql
Pregunta: Disculpen una duda, como cargar de excel un formato iniciando en la segunda fila? tengo este código solamente que el excel esta justificado en ...
No completa el ciclo foreach – c#
Pregunta: Estoy haciendo un método para invertir palabras que contengan 5 o mas letras. El problema que tengo es que si mi cadena tiene mas ...
Obtener elementos específicos de un array – c array optimización
Pregunta: Buenas, si yo por ejemplo hago: char buf; fgets(buf, 1024, stdin); ¿Puedo coger los caracteres que escribí del array sin coger los elementos que no utilicé? ¿O ...
Averiguar número de elementos en un array de LUA – c++ array lua
Pregunta: ¿Cómo puedo averiguar el número de elementos que contiene un array en un fichero LUA? me gustaría poder volcarlo a un entero desde C++. -- ...
Tags:,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *