| ID | Asunto | Fecha | Nick | |
| 52126 | API - WaitMessage | 14/03/10 23:34 | epko | |  |
¿Alguien sabría porqué el WaitMessage de la siguiente situación no funciona?:
Proyecto VB6
Declaro la función:
Private Declare Function WaitMessage Lib "user32" () As Long Private Declare Function GetQueueStatus Lib "user32" (ByVal fuFlags As Long) As Long
Declaro todas las constantes asociadas a SendMessage y WaitMessage, y entre ellas:
Const QS_SENDMESSAGE = &H40
En el proc Private Sub Form_Load(), pongo:
MsgBox Str(GetQueueStatus(QS_SENDMESSAGE)) 'Sigue = WaitMessage WaitMessage MsgBox "Ha pasado"
Y el resultado es que aparece el primer MsgBox con cero como contenido de la cola, y directamente, al aceptar ese MsgBox, sale el segundo diciendo que "ha pasado" por el WaitMessage sin que le mandara ningún mensaje, o sea, que se lo ha saltado.
La linea Sigue = WaitMessage puesta activa también produce lo mismo. La variable Sigue la he declarado como Long.
Entiendo que WaitMessage debería producir la suspensión de la ejecución hasta que le llegue un mensaje enviado p. ej. con SendMessage.
¿Alguien sabría qué puede pasar?
Gracias |
|
| ID | Asunto | Fecha | Nick | |
| 52515 | Re: API - WaitMessage (Resp: 52126) | 22/04/10 22:35 | elGuille [MVP] | |  |
Esa función (WaitMessage) en teoría espera a que se produzca un mensaje en el hilo actual, y ten en cuenta que mensajes se están produciendo de continuo... el truco consiste en comprobar si el mensaje recibido es el que esperas y hacer lo que haya que hacer... Normalmente se usa junto con PeekMessage, y no se si te servirá, pero aquí tienes un ejemplo: Registrar Hot-Keys para nuestra aplicación (para activarla, por ejemplo)(Nota: si ese ejemplo no funciona... ¡no me preguntes! que es del año 1998  )        elGuille
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
| ID | Asunto | Fecha | Nick | |
| 52519 | Re: API - WaitMessage (Resp: 52515) | 22/04/10 23:57 | epko | | |
Gracias, Guille
Puse la cuestión porque estoy buscando la forma de suspender la ejecución de código VB6 en medio de un procedimiento, hasta que se produzca un evento, y consumiendo los menores recursos posibles (procesador, memoria). Creo que puede ser una necesidad bastante común para desarrolladores, que me ha sorprendido no encontrar resuelta.
Se puede hacer a lo bestia con un bucle que no salga de él hasta que se produzca el evento, pero te comes el procesador aunque le pongas un DoEvents en medio.
La forma en que estoy intentando resolverlo es esperar a que llegue el mensaje de que ha ocurrido el evento mediante llamadas a la API, que no cosumen recursos; algo así como la espera de un MsgBox, que suspende la ejecución hasta que el usuario hace algo en el MsgBox, pero en este caso, el "seguir" lo produce un evento que ocurra en nuestro programa o en otro.
Es decir, la cosa está por instrucciones API de eventos (CreateEvent, SetEvent, OpenEvent) y un WaitForSingleObject, pero los intentos que he hecho no me funcionan
He hecho dos proyectos VB6 que he puse en megaupload.com/?d=BN6313RD (si han quitado el enlace, decídmelo).
La idea es; un proyecto tiene basicamente un CreateEvent y un SetEvent. Con ello deberíamos tener evento por el sistema. Y el otro tiene el OpenEvent para escucharlo y el WaitForSingleObject para esperar a que suceda.
Parece que el el primero funciona, salvo quizá en algo relacionado con el nombre del evento, y sea por ello por lo que el otro no lo identifica. Y el segundo parece que no identifica el evento y el WaitForSingleObject no se espera, pasa de largo.
He puesto varios MsgBox para que cante datos de paso y el de después del WaitForSingleObject da error; un error 5 (ERROR_ACCESS_DENIED), he intentando meterle a capón el handler del evento con un inputbox, entonces el error es el 6 (ERROR_INVALID_HANDLE) (y eso que se lo meto a capón).
La conexión del CreateEvent con OpenEvent por el nombre dado al evento es el procedimiento sugerido en MSDN; "... The creating thread can also specify a name for the event object. Threads in other processes can open a handle to an existing event object by specifying its name in a call to the OpenEvent function ...".
Si alguien puede echar una mano...
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |