Pregunta

Tengo que ejecutar algún código en el contexto del hilo principal. Estoy usando Lazarus + FPC. Recibo un evento de un hilo dentro de una DLL (biblioteca compartida si está en Linux) y se llama a mi función de devolución de llamada. Tenga en cuenta que esta función no es miembro de ninguna clase sino una función tradicional independiente con una directiva "CDECL" adjunta.

Tengo que Triger un manejador de eventos de propiedades correspondiente para cada mensaje que recibo. Y estos eventos deben transmitirse en el contexto del hilo principal. Sé de dos de esas soluciones:

  1. Postmessage
  2. Application.queueasynccall

El primero está bien, pero requiere un mango de ventana. Y dado que este es un código de biblioteca, no hay manejo disponible. AllocateHwnd no es una opción ya que no es una plataforma cruzada. Sé que puedo crear una forma ficticia, pero esta es una muy mala solución.

El segundo funciona bien, pero tengo un problema, que la llamada no se procesa hasta que muevo una aplicación interna del mouse, por ejemplo. Tal vez estoy haciendo algo mal, no lo sé. Es como si mi llamada se esté procesando solo cuando el procesamiento de mensajes entra. Pero aparentemente puede ser una larga espera.

Así que quiero saber cuál es la mejor solución aquí (probablemente queueasynccall) y cómo puedo estar seguro de que mi mensaje (llamada) se procesará en un plazo aceptable.

¿Fue útil?

Solución

No puede estar 100% seguro, al igual que no puede en ningún sistema que no sea real. Si la lectura principal cuelga, no verificará los mensajes u otros eventos en el bucle principal. Esto es normal.

Lo único que puede hacer es evitar hacer cosas en la lectura principal que puede llevar mucho tiempo. Es el truco del comercio para juzgar exactamente lo que es necesario y lo que no. Algunas personas orientadas a tiempo real mueven todo el acceso del sistema de archivos a los subprocesos y mantienen la GUI estrictamente para la interfaz de usuario, solo porque si un usuario configura una ruta en una red compartida para esta u otra, un problema con la parte puede causar fácilmente una espera de tiempo de espera largo, de minutos incluso.

Si miro la aplicación.QueueasyncCall, no veo un procesamiento de AFRIE (no hay colas bloqueadas), de modo que uno esté fuera.

Sé que el postmessage es emulado por Lázaro hasta cierto punto en no Windows, y verifiqué la implementación y tiene bloqueo, por lo que supongo que es seguro multiproceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top