Programación General > Visual Basic 6.0 e inferiores

 API - WaitMessage

<< < (2/2)

epko:
Hola otra vez. He estado dándole más vueltas y he abordado otro camino; el de los eventos y WaitForSingleObject. Creo que el esquema no anda muy descaminado, pero algo falla. Es el siguiente:

He hecho dos proyectos VB6 que he intentado adjuntar pero no me ha dejado la web del foro porque parece que no tengo privilegios para ello (además, me ha tocado escribir el mensaje otra vez porque el cabrito del sistema no lo ha mantenido al volver atrás como no me dejaba adjuntar, cosa que podía advertir desde el principio o estar capada la opción, lo digo por si el moderador y los webmaster...). Bueno, los he puesto en el siguiente enlace:

megaupload.com/?d=BN6313RD   (es que no me deja poner enlaces tampoco, por eso no lo pongo completo)

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 ...".

Anda Nebire, por favor, a ver si puedes abrir camino.

Gracias

Nebire:
Bueno, tenía un hueco en dicho momento, pero llevo unos días bastante ocupado y todavía estaré bastante ocupado una semana más por lo menos, pero lo anoto y en cuanto encuentre un tiempo libre te lo hago.

Mientras intenta ver si logras resolverlo por tu ingenio.
Eso si, cuando hablo de eventos, no necesariamente estoy hablando de los eventos de la API, los de vb valen también.

Te pongo un resumen de como es el procedimiento (con el poco tiempo que ahora mismo tengo), aunque se pueda implementar con las variaciones que cada uno considere.

Primero debemos decidir, si la aplicación ha de tener capacidad de decidir si 'autoesperar' cuando solicita una petición o si esta actúa como un servicio y por tanto siempre espera hasta que otra aplicación la active o la pare.

Sea como fuere hay que establecer un pequeño protocolo para que una aplicación comunique a la otra, lo mejor para ello es disponer de unos datos que ambas aplicaciones sepan entender. Para esto lo mejor es inyectar (encapsular) todo el protocolo en una clase de la que ambas aplicaciones tienen una instancia.

Esta clase portaría toda la funcionalidad y tendría al menos 2 eventos. Y tendría 2 campos que por comodidad podríamos llamar cliente y servidor, cliente sería un puntero a la aplicación que tiene que esperar y servidor sería un puntero a la aplicación que en un momento dado debe enviar el mensaje esperado. El tipo de mensaje esperado debería ser un mensaje de usuario (WM_USER), y el código recibido es lo que la clase trata en profundidad, por ejemplo un valor x enviado al servidor pone al cliente en modo de espera y estará así hasta que el servidor le envíe un valor de mensaje Y, esto se le comunica al servidor mediante el evento a tal fin, una vez que el servidor devuelva por referencia si acepta o no la petición delcliente, la clase pondría al cliente en espera... como ya se indicó esto sería usando una función de callback, cuando se reciben mensajes se comparan con el estado establecido en la clase (esperando=true ?), si es true, se comprueba si es wm_user y si lo es si tiene el 'valor esperado', si es así cambiamo estado (esperando=false), ahora todos los mensajespasan, antes todos rebotaban (exit sub). En esta parte, pued eusarse alguna función de Wait de la API, si cumple nuestros propósitos o bien dejarlo tal como lo hemos descrito, no se notará mucha diferencia de rendimiento,  ya que las funciones wait hacen esto mismo, interponer una función callback y filtrar.

Los filtros a este nivel son ra´pidos porque los mensajes no seprocesan, sólo se filtran, es el procesarlos (todos) lo que produce  una caída de rendimiento si luego van a ser descartados.

Las funciones wait, no obstante están un 'nivel' más arriba pues, es decir estarían colocados antes que cualquiera de nuestras funciones callback, en una posible cascada, de hecho están en el nivel donde se decide que mensajes se envían o no a una aplicación.

epko:
Voy a ver si lo consigo a partir de tus explicaciones. Así en una primera leida, me creo que no lo conseguiré, pero lo voy a intentar... y si lo consigo, por supuesto lo pongo aquí.

Creo que este problema que planteo es bastante "de propósito general", uséase, con amplia aplicación y con gente por ahí pidiendo ayuda en una solución, según he visto buscando en Google, pero no he visto soluciones. Es por todo ello por lo que decía que me sorprende que las soluciones no estén más al alcance general; bien por soluciones directas implementadas en VB o en API, o por soluciones más desarrolladas que estén publicadas por ahí en foros p. ej.

En el caso inmediato que yo lo quiero aplicar, el código "esperante" iría en un VB para aplicaciones (los de Office p. ej.) y el desencadenante, en un proyecto VB6.

Gracias, Nebire, y si algún otro espontáneo quiere colaborar... gracias tb

epko:
He estado fuera de juego 6 meses. Escribo para decir que a mí me resulta difícil implementar la solución que describe Nebire, no obstante, acabo de ver que otro forero dió solución por la vía de los mensajes entre aplicaciones, lo podeis ver en canalvisualbasic.net/foro/visual-basic-6-0/api-waitmessage-14635/
a quien se lo he agradecido mucho. Hay un pequeño error y es que en el código común de los dos proyectos, hay que meter tb la llamada a API de la función PostMessage, o al menos ponerla en el proyecto que envía el mensaje.

Si alguien consigue solución mediante eventos, creo que estaría muy bien como un recurso más.

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa