ventana venta una transferir refrescar recargar pagina modal madre hija despues desde datos cerrar automaticamente actualizar delphi winapi window

delphi - venta - refrescar pagina padre despues de cerrar popup



La ventana padre se congela cuando la ventana hija se congela aunque es de otro proceso (1)

No puede esperar bloquear la secuencia de la GUI de ningún proceso. En su escenario, las cosas son un poco más complejas porque hay dos subprocesos GUI. Uno para cada proceso.

Sin embargo, al establecer una relación padre / hijo entre las ventanas de estos procesos, también está introduciendo el requisito de que ambos subprocesos de GUI se atiendan a tiempo.

Los Windows que están en una relación padre / hijo se enviarán mensajes entre sí. Y si esos mensajes son sincrónicos, se envían en lugar de enviarse, entonces el bloqueo de un hilo de GUI dará lugar a que el otro se bloquee.

La regla de oro de la programación de GUI sigue vigente: no bloquee un hilo de GUI. Si tiene una tarea de larga ejecución, muévala a un hilo de fondo.

Actualizar

OK, como se explica aquí cuando relaciona ventanas de diferentes hilos, adjunta sus colas de mensajes entre sí. Entonces, si bloquea un hilo, bloquea todos los hilos adjuntos.

Por lo tanto, no bloquee un hilo de GUI.

Descargo de responsabilidad : no estoy familiarizado con la API de Win32, especialmente sobre cómo funciona Windows.

Me gustaría hacer que la ventana de algún proceso sea una ventana secundaria de otro proceso. Los dos procesos son también padres e hijos. Pero no creo que eso importe. Hasta ahora, todo funciona como un hechizo: hasta que congele el hilo principal de la ventana secundaria.

Imagine un contenedor.exe que ''hosts'' notepad.exe y someApplication.exe

Cuando suspender el hilo principal de someApplication.exe durante unos segundos, su ventana se congela durante ese período de tiempo. Eso es perfectamente comprensible. Pero la ventana de container.exe también se bloqueará por el mismo tiempo. Las ventanas secundarias de otros procesos alojados (como notepad.exe ) continuarán funcionando bien.

Estoy usando el comando SetParent para hacer que una ventana no infantil habitual sea un elemento secundario de mi container.exe:

SetParent( childProcess.HWND, myOwnHWND );

Después de eso, estoy usando setWindowPos :

SetWindowPos( childProcess.HWND, HWND_TOP, someXPos, someYPos, 0, 0, SWP_FRAMECHANGED or SWP_NOSIZE or SWP_SHOWWINDOW )

Como sugiere el artículo de MSDN sobre SetParent , también WS_POPUP atributo de estilo WS_POPUP y agrego un atributo WS_CHILD . Como eso tampoco ayudó, también agregué un atributo de estilo extendido WS_EX_NOACTIVATE , ambos usando el comando SetWindowLongPtr . Finalmente, intenté enviar a ambas ventanas un WM_UPDATEUISTATE y luego un mensaje WM_CHANGEUISTATE pero eso tampoco cambió nada.

Lo que me confunde es que la ventana del proceso principal continúa dibujándose normalmente, hasta que la toco. Luego se congela por completo hasta que la ventana secundaria se descongela. Sospecho que algo se llama ''cola de entrada'' . El artículo de MSDN sobre un mensaje WM_ACTIVATE indica:

Enviado tanto a la ventana que se está activando como a la ventana que se está desactivando. Si las ventanas usan la misma cola de entrada , el mensaje se envía de forma síncrona , primero al procedimiento de ventana de la ventana de nivel superior que se está desactivando, luego al procedimiento de ventana de la ventana de nivel superior que se activa. Si las ventanas usan diferentes colas de entrada, el mensaje se envía de forma asíncrona, por lo que la ventana se activa de inmediato.

Debido a eso, tenía grandes esperanzas para el atributo de estilo extendido WS_EX_NOACTIVATE .

Para resumir: ¿es realmente posible alojar la ventana de otro proceso y no congelar su propia ventana cuando la ventana hija se congela?