Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





DirectInput buffered

Iniciado por davidgf, 27 de Septiembre de 2007, 09:01:09 PM

« anterior - próximo »

davidgf

Hola otra vez (hartos de mi?? xD)

Otro problema más. Este más dificil.

Uso DirectInput buffered para el Mouse y va bien hasta que se llena el buffer. Entonces el GetDeviceData ya no devuelve más elementos.

Debo borrar el buffer? Indicarle que ya no quiero los datos leídos? Como lo hago. La docu no dice nada de eso. Dice que se borra solo predeterminadamente.

Alguna ayudita??

Muchas gracias a todos
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

shephiroth

Por curiosidad, tu proceso "duerme" en algun momento?? Si el thread en el que se esta ejcutando no duerme es normal que no se actualice el buffer de DI, porque basicamente no le dejas (si te interesa, esto viene de que ciertos datos estan sincronizados (si un thread accede el resto esperan) y hasta q tu proceso no deja los datos libres DI no puede actualizarlos).

SUERTE!!!

davidgf

Si si duerme duerme.

Lo que sucede es que funciona a la perfeccion hasta unos segundos (mejor dicho unos movimientos del raton). me explico:

muevo el raton un poco i ahi se queda bloqeuado. SI no lo muevo un rato i lo muevo luego tambien. Escribo un log i veo que deja de pasarme datos (nEvents en el buffer=0) al cabo de tantas lecturas como tamaño tiene el buffer.

es como si se llenara (por asi decirlo) ya que deja de pasar datos cuando se han producino unos cieertos numero de eventos. si aumento el buffer dura mas....
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

shephiroth

Por lo que comentas parece claro que es por el buffer Voy a mirar si por google o por msdn encuentro algo.....fue bastante rapido, aqui tienes el enlace al msdn http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c_Summer_04/directx/input/ref/ifaces/idirectinputdevice9/GetDeviceData.asp

Por lo que pone tienes que borrar el buffer despues de pedir los datos. Mirate el enlace, seguramente entenderas mas que yo de que va todo eso.

SUERTE!!

pacomix

Acabo de leer el post y he recuperado la clase de ratón que tenía.
Me parece que lo que tenías que hacer es adquirir de nuevo el dispositivo de ratón si fallaba la adquisición de datos. Todo esto lo saqué de la MSDN.

Te pego el trozo de código que se encargaba de actualizar la entrada de ratón.


HRESULT CGaeUserInput::updateMouse(){
m_DIMDataElements = 1;
if (CHECK_RESULT(m_pDIMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), &m_DIMData, &m_DIMDataElements, 0), getName())){
if(m_DIMDataElements > 0){
doMouseAction(m_DIMData);
} else {
return S_FALSE;
}
} else {
m_DIMDataElements = 1;
if (CHECK_RESULT(m_pDIMouseDevice->Acquire(), getName() )){
if (CHECK_RESULT(m_pDIMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), &m_DIMData, &m_DIMDataElements, 0), getName() )){
if(m_DIMDataElements > 0){
doMouseAction(m_DIMData);
} else {
return S_FALSE;
}
} else {
return S_FALSE;
}
} else {
return S_FALSE;
}
}
return S_OK;
}
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

davidgf

Gracias!!

Ya conseguí hacerlo funcionar, pero añadiré tu comprobación ya que a veces falla en adquirirlo. Gracias de nuevo!
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Pogacha







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.