Hola, gracias por la respuesta.
No me refería a que el hilo se quedase bloqueado, quiero decir que hacer ReadFile sin OVERLAPPED si se queda bloqueado, lo que quiero es tener una función que haga ReadFile a lo que haya en el buffer, y si no hay nada, que no se quede bloqueado.
Para ello creo que la manera de hacerlo es con OVERLAPPED, y al hacer ReadFile internamente se lanza un hilo, si yo lo he entendido bien.
Mi problema entonces es que no uso bien el OVERLAPPED porque la función ReadFile me devuelve un error que no es ERROR_IO_PENDING (que es lo que debería devolverme si no hay nada en el buffer).
He seguido intentándolo, pero aún no ha habido suerte.
Saludos.
Me referia a eso mismo, Windows pone en modo de espera el hilo que es usado para solicitar peticiones sincronicas, queda esperando hasta que la solicitud es completada.
EDITO:
He cambiado el CreateFile para ponerlo en lectura compartida y FILE_FLAG_OVERLAPPED y algunos otros errores que tenía, ahora el readExisting()
"parece" que funciona bien, porque al hacerlo me devuelve una cadena vacía.
El problema es que con el emulador que uso, al hacer write sobre COM3 (que está conectado a COM4), si no tengo abierto el hyperterminal no escribe nada en el buffer, no se por qué. El caso es que no puedo probarlo del todo pero creo que ya va bien, gracias por la respuesta. Si consigo comprobar que todo funciona subo el código para el que lo quiera ver.
Saludos.
Entonces ¿cómo el programador sabria si fue enviado con exito?
EDITO 2:
Resulta que si hacemos el CreateFile con FILE_FLAG_OVERLAPPED ya no se pueden hacer lecturas síncronas. Tiene que ser lo uno o lo otro. La única solución que veo entonces (para hacer una clase que tenga métodos síncronos y asíncronos) es pasar del overlapped y crearme yo mis propios hilos. Si hay alguna manera mejor de hacerlo, agradeceré que me lo expliquen. No tengo claro si será mejor idea andar con hilos o, cada vez que quiera hacer el readExisting(), cambiar el readtimeout del puerto a 0.
Saludos.
Usando el mismo handle para para solicitudes sincronicas y asincronicas no es posible, sino ¿cómo haria Windows para saber cuando el programador necesita una petición sincronica o asincronica? al crear el objeto de archivo este contiene unas banderas donde guarda la información. Podes abrir más de un handle, una para peticiónes sincronicas y otro para asincronicas o podes usar ReOpenFile para cambiar los attributos del handle mismo.
-
Toma en cuenta que si las peticiones son asincronicas no habrá espera asi que el contenido del buffer es indefinido, para saber si la solicitud fue completada usa WaitForSingleObject con el mismo evento pasado a las funciones.