Hola,
Tienes razón, pero hay varios detalles específicos en este caso, es decir, según la pregunta inicial hay que tomar en cuenta lo siguiente:
Cita:
Iniciado por eferion Tan crítico es el rendimiento? en este caso lo dudo. Está claro que dejar al SO la responsabilidad de "despertarte" cuando puede ser lo ideal. Sin embargo hay que tener en cuenta otras consideraciones: ...
No se que tan crítico sea el rendimiento, pero hagamos suposiciones, la pregunta inicial dice que quiere saber 'cuando se haya conectado el dispositivo móvil', por supuesto que puede consultar cada 2 o 3 segundos si el dispositivo ya se conectó o no, y en la actualidad, con procesadores de 64 bits y varios núcleos, el rendimiento no va a ser tan malo.
La cuestión es que se preguntó ¿cual es el mejor método?
En este caso seguir las instrucciones de como hacer una aplicación para Windows, recibiendo el (WM_) mensaje de dispositivo correspondiente es lo mas correcto. Hay muchos métodos más, pero desde mi punto de vista, es la forma mas adecuada de funcionar de una aplicación diseñada para Windows. Incluyendo que la ventana que posiblemente tenga que crear no necesariamente tiene que ser visible.
Cita:
Iniciado por eferion ...
* La espera puede no permitirte abortar el proceso de una forma sencilla ...
Realmente la aplicación delega el control a Windows mientras espera por el mensaje, pero si quieres abortar es de lo mas simple. Suponiendo que creara una ventana entonces cualquier ventana de Windows se puede abortar en cualquier momento, con el botón Cerrar, eso envía un PostQuitMessage y todo termina o también puede agregar un botón y recibir el evento del botón. Si quiere abortar en la consola con Ctrl+C solo debe recibir los eventos correctos, como cualquier otra aplicación.
Aprovechando voy a agregar algo adicional, nunca se va a producir un abort realmente, es el flujo natural de haber usado GetMessage y el Event Loop de Windows correctamente. Lo interesante de esa forma de manejar los mensajes es que recibes todos los mensajes en un mismo loop. Por lo tanto, aunque no recibas un mensaje de que ya se conectó el teléfono puede ser que recibas un mensaje que se presionó un botón (cualquier botón) o que se presionó el botón de Cerrar de la ventana. O inclusive puedes recibir eventos de que el sistema operativo se va a apagar y puedes cerrar tu proceso tranquilamente, normalmente.
En todo ese proceso puedes recibir los eventos que quieras o dejar de recibir cualquier evento que no deseas, eso significa que antes de comenzar a recibir eventos de conexión de dispositivo te registras para recibirlos. O cuando ya no quieres técnicamente no tienes que abortar nada, simplemente te desregistras de recibir esos eventos y todo normal. Es lo normal de las aplicaciones para Windows en C, en C++ podrá variar un poco, por ejemplo si se hace uso de MFC u otras librerías.
Como los eventos llegan en cola posiblemente presionaste el botón de desregistrarte de recibir eventos del dispositivo (Abortar, Cerrar o cualquier otra cosa, que definiste en la ventana) antes de recibir el evento y si después llega el evento de dispositivo ya no lo recibes, técnicamente no abortaste nada, simplemente le indicas que ya no te interesa recibir esos mensajes, y en cualquier momento puedes detener tu aplicación normalmente, inclusive cuando detecte que se retiró el dispositivo, porque llegó el mensaje si ese fuera el caso, o cuando tu quieras. (Una vez limpiando los recursos usados y desregistrandote de cualquier cosa que te hayas registrado).
Aunque lógicamente todo esto va a variar dependiendo de muchos factores.
Cita:
Iniciado por eferion ...
* La solución, desde luego, no es portable
...
Cierto, pero el usuario mencionó explícitamente Windows 7 en el mensaje inicial.
Cita:
Iniciado por eferion ...
* La solución es más compleja de implementar y lo mismo no es necesario
Tienes toda la razón, lo mas simple ya lo mostró
lareto en el vínculo de su último mensaje, y no es tan simple, pero es la manera mas adecuada de funcionar de una aplicación para Windows, es decir, Windows API 101 para detectar cuando un dispositivo se ha conectado de la manera adecuada.
No te quiero llevar la contraria, posiblemente las necesidades de
shekel no son esas, posiblemente se la hace muy complicado, posiblemente no es lo que se requiere en este caso, pero según la pregunta inicial, desde mi personal punto de vista, el vínculo de
lareto es la respuesta mas adecuada, que es básicamente lo que propuse inicialmente.
Saludos,