Los foros del Guille

MKN Reservas (Maro - Kayak Nerja)


Kayak Maro - Rutas y alquiler de kayak y tabla

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 
Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu inter�s (algunos de los avisos publicados)

01/feb./2019

Como te avisé, desde el 1 de febrero de 2019

No se podrán escribir nuevos mensajes ni editar los existentes

En breve solo se mostrarán los mensajes con respuestas.
Posiblemente para el 1 de marzo, solamente se mostrarán los que tengan respuestas y estén marcados como respuesta válida.

  Foro: VB6.General Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 52126 - API - WaitMessage
IDAsuntoFechaNick 
52126 API - WaitMessage14/03/10 23:34epko   
¿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
IDAsuntoFechaNick 
52515 Re: API - WaitMessage (Resp: 52126)22/04/10 22:35elGuille [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 guinio )
   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
52519 Re: API - WaitMessage (Resp: 52515)22/04/10 23:57epko   
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.

 
(c) Guillermo 'guille' Som, 2005-2026  - foros.elGuille v1.0.6.3 (01/Jun/2021 12:45 GMT +2)  - (ASP.NET v4.0.30319.42000)
 
La hora GMT del servidor es: 10/06/2026 11:52:23 GMT