• Sábado 14 de Diciembre de 2024, 20:23

Autor Tema:  Esperar A Un Evento Sin Bloquear El Programa  (Leído 3648 veces)

Anniuska

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Esperar A Un Evento Sin Bloquear El Programa
« en: Miércoles 9 de Junio de 2004, 11:50 »
0
Hola. Estoy haciendo un programa que se comunica a través del puerto serie con una controladora de un robot. Utilizo una libreria que me permite enviar y recivir comandos por el puerto serie mediante eventos, es decir, cuando recibo un caracter hay un evento que ejecuta una función. Mi problema es el siguiente: cuando yo envio una orden, necesito esperarme a que el robot me envie una serie de información hasta que finalmente me envia un caracter determinado (>) para que yo le pueda enviar la siguiente orden. El problema es que no se como hacer para que el programa se pare en una línia de código y no pase a la siguiente hasta que se ejecute este evento sin bloquear el programa.
He probado con un while pero entonces bloquea el programa.
También he probado de realizar un evento cuando llegue el caracter determinado con la orden SetEven(...) y que el el programa se espere con la orden WaitForSingleObject(...) pero pasa de mi, no se espera.

No estoy utilizando las ordenes correctas??!! Como puedo hacer para que el código se espere para ejecutar la siguiente orden hasta que haya un evento ( o valor, o lo que sea) sin que se bloquee el programa y pueda atender a la vez otros eventos?

Ayudarme, por favor. Ya no se que hacer..

Anna

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Esperar A Un Evento Sin Bloquear El Programa
« Respuesta #1 en: Miércoles 9 de Junio de 2004, 12:10 »
0
Si creas esa función como thread no bloquea el resto de la aplicación.

Ejemplito:


//creamos un thread con la funcion MergeIndex()
DWORD dwThreadId, dwThrdParam = 1;
dwThrdParam = (DWORD)Archivo;
CreateThread(NULL,NULL,MergeIndex,(void*)dwThrdParam,0,&dwThreadId);

DWORD WINAPI MergeIndex(LPVOID lpParam)
{
  //aca hacer lo que se quiera
  while(1)
  {
    //por ejemplo
  }
}

 :ph34r:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Anniuska

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Esperar A Un Evento Sin Bloquear El Programa
« Respuesta #2 en: Jueves 10 de Junio de 2004, 10:22 »
0
Hola, gracias por la idea.  Empiezo a ver por donde van las cosas. Pero tengo otra pregunta. He utilizado tu ejemplo, y he hecho una función como la tuya de MergeIndex() y la he definido static (realmente no sé muy bien que significa eso pero he leido que tenia que ser asi y es la única manera de que compile). Esta función esta dentro una clase hecha por mi. El problema se me plantea cuando dentro de esta función quiero utilizar funciones de la misma clase que no són static. Me da un error que dice: "illegal call of non-static member function", cosa que antes no me habia salido al llamar a estar funciones. Como hay que llamar a las funciones que no  són static dentro de la función que si es static?

Muchas gracias por tu ayuda, realmente es muy valiosa


Anna
anna.andres@estudiant.upc.es

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Esperar A Un Evento Sin Bloquear El Programa
« Respuesta #3 en: Jueves 10 de Junio de 2004, 10:47 »
0
Una función callback del sistema tiene que tener los parametros exactos de la API, las clases pasan a sus funciones el puntero this. Para poder usar los demás miembros vas a tener que hacer un "truquito" que consiste en pasarle el puntero this a la función estatica y hacer un casting al nombre de la clase, así podes acceder a los otros miembros si no es imposible.

A ver como hago un ejemplo ... vamos a usar una clase muy simple.

class Id
{
  public:
  Id()
  {
    myname = (char*)malloc(150);
    ZeroMemory(myname,150);
  }

  ~Id()
  {
    free(myname);
  }

   void Name(char *NewName);
   const char *Name();

   static DWORD WINAPI MergeIndex(LPVOID lpParam)
   {
      Id *xp = (Id*)lpParam;
      MessageBox(0,xp->Name(),xp->Name(),0);
      return 0;
   }

  private:
    char *myname;
};

void Id::Name(char *NewName) { strcpy(myname,NewName); }
const char *Id::Name() { return myname; }


//creamos un thread con la funcion MergeIndex()
DWORD dwThreadId, dwThrdParam = 1;
Id *p = new Id[1];
p->Name("holas");
dwThrdParam = (DWORD)p;
CreateThread(NULL,NULL,p->MergeIndex,(void*)dwThrdParam,0,&dwThreadId);


Name() va a devolver "holas" por que le pasamos el puntero de la clase.

 :ph34r:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Esperar A Un Evento Sin Bloquear El Programa
« Respuesta #4 en: Jueves 10 de Junio de 2004, 10:59 »
0
Aca tenes otro código que en su momento puse en el foro http://www.jeanpaul.com.ar hace un tiempo:


class Valvula
{
private:
static DWORD WINAPI AbrirValvula(LPVOID lpParam)
{
Valvula *mi_valvula = (Valvula*)lpParam;
DWORD Now = GetTickCount();
do
{
}while(GetTickCount() < Now + mi_valvula->TimeToWait);
mi_valvula->Abierta = TRUE;
}
DWORD TimeToWait; //en milisegundos

public:

BOOL Abierta;

Valvula()
{
Abierta = FALSE;
TimeToWait = 0;
}

void Abrir(DWORD Espera) //en milisegundos
{
DWORD dwThreadId, dwThrdParam = 1;
dwThrdParam = (DWORD)(this);
TimeToWait = Espera;
CreateThread(NULL,NULL,AbrirValvula,(void*)dwThrdParam,0,&dwThreadId);
}
};

Podes probar con este codigo:
Valvula xp;
xp.Abrir(5000);


 :ph34r:  :comp:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Anniuska

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Esperar A Un Evento Sin Bloquear El Programa
« Respuesta #5 en: Miércoles 16 de Junio de 2004, 11:53 »
0
Muchas gracias por tus consejos. Al final he conseguido que todo me salga bién. Llevaba muchos dias parada por culpa de este problema.
Me has ayudado mucho. Muchas gracias

Anna

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Esperar A Un Evento Sin Bloquear El Programa
« Respuesta #6 en: Miércoles 16 de Junio de 2004, 11:55 »
0
De nadas, me alegro de que te haya servido.

 :ph34r:  :comp:  :hola:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.