Me gustaría crear una ventana en un subproceso, y luego hacer que ese HWND migre a uno de varios subprocesos en los que se ejecutará. Mi programa tendrá múltiples ventanas similares. ¿Es esto posible o la API de Win32 no fue diseñada para esto?¿Las ventanas Win32 son seguras?
Respuesta
No, esto no es posible. El hilo que utiliza una ventana para su ciclo de mensaje (lo que usted llama "ejecutar") se define en el momento en que se crea la ventana. Puede crear varios subprocesos e iniciar bucles de mensajes desde ellos (y así crear ventanas en ellos), pero esto generalmente se considera peligroso.
¿Cuido de los downvoter les gusta comentar? –
Llegó un tipo y rechazó todo con una flecha hacia abajo en esta página, intenté deshacerlo –
No es el que menos votó aquí, pero me gustaría saber: ¿Cómo/por qué el uso de varios hilos de la GUI es 'peligroso'? Es tal vez una práctica avanzada, no algo que deba hacer en un Hello World promedio o en una aplicación de diálogo simple, pero que no sea peligrosa de lo que yo sepa. Es una práctica común en muchas aplicaciones complejas (Explorer, IE, oficina probable también). – BrendanMcK
No, no hay comprobación de simultaneidad en esas llamadas.
Sí, hasta cierto punto.
Puede enviar y publicar mensajes en un HWND desde cualquier conversación.
http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx
intentar configurar la interfaz de usuario (por ejemplo, añadir controles) de otro hilo terminará mal. Sin embargo, si envía un mensaje a su ventana, puede estar seguro de que el mensaje se procesará en el hilo de creación.
Esta es la respuesta más correcta: Win32 es en realidad el marco de interfaz de usuario más indulgente con respecto al acceso entre hilos, win32k.sys intenta hacer que todo funcione. Sin embargo, sigue siendo una mejor idea fingir que no lo sabe, y operar como si los objetos estuvieran afinados con el hilo –
Sí. "Mayormente funciona" no es una descripción que me gusta asociar con nada de lo que escribo :). Parece que si no eres muy estricto con los mensajes de envío/publicación (o sus contrapartes del siglo 21), a veces sucede algo extraño. –
Esta es la mejor respuesta, porque el envío de mensajes es lo que me interesa. –
Hay dos llamadas importantes que must be called from the same thread: CreateWindow
y GetMessage
(o sus equivalentes respectivos). Tu solución no, así que está mal.
Puede llamar al PostMessage
en cualquier hilo. SendMessage
es algo peligroso porque bloquea en escenarios de hilos cruzados, y podría un punto muerto.
Tuve una situación hoy en la que algún código en un hilo de trabajo llamado SendMessage desde una sección crítica y punto muerto. Después de haber perdido una hora mirándolo, pensé que era más prudente simplemente poner el procesamiento en el hilo de la interfaz de usuario y enviar mi instrucción a través de PostMessage. – locka
- 1. ¿Las funciones LoadLibrary, FreeLibrary y GetModuleHandle Win32 son seguras?
- 2. ¿Las matrices C# son seguras?
- 3. ¿Las engas C# son seguras?
- 4. ¿Las segmentaciones de C# son seguras?
- 5. ¿Son seguras las consultas multilínea sql-injection?
- 6. ¿Son seguras las preg_functions de PHP multibyte?
- 7. Ayuda de la sesión CodeIgniter, ¿las cookies no son seguras?
- 8. ¿Son seguras las tablas temporales en SQL Server multiusuario?
- 9. ¿Las funciones de tiempo de MSVC son seguras para subprocesos?
- 10. ¿Las propiedades estáticas autoejecutadas por C# son seguras para subprocesos?
- 11. cuán seguras son las declaraciones preparadas por PDO
- 12. ¿Las clases de singleton son seguras para subprocesos en IIS?
- 13. ¿Qué tan seguras son las claves de acceso Amazon AWS?
- 14. ¿Qué tan seguras son las sesiones de PHP?
- 15. ¿Son seguras las matrices de Java en un método estático?
- 16. ¿Qué tan seguras son las variables de sesión de PHP?
- 17. ¿Las instancias del programador de Quartz son seguras?
- 18. Cómo hacer varias ventanas usando Win32 API
- 19. ¿Tus colecciones son seguras para hilos?
- 20. ¿Cuáles son las diferencias entre RedrawWindow y UpdateWindow en Win32?
- 21. ¿Las consultas dinámicas de mysql con sql escapan son tan seguras como las declaraciones preparadas?
- 22. ¿Están seguras las clases de Static?
- 23. Portabilidad de pthreads-win32 sobre varios compiladores de ventanas
- 24. Actualizando el orden Z de muchas ventanas usando Win32 API
- 25. ¿Cómo se aplican las contraseñas seguras?
- 26. ¿Qué operaciones en el nodo son seguras para hilos?
- 27. ¿Qué operaciones son seguras para hilos en std :: map?
- 28. ¿Cuáles son las técnicas para permitir actualizaciones de software seguras en sistemas integrados?
- 29. ¿Las llamadas a los métodos de Javascript son seguras o sincronizadas?
- 30. ¿Las funciones en línea en C/C++ son una forma de hacerlas seguras para subprocesos?
¿Desea crear algo en un hilo y luego eliminarlo en otro y no ve ningún problema con esa idea? – AJG85
@AJG: no es problema para 'new' /' delete'. Completamente razonable preguntarse sobre otros recursos. – MSalters
@MSalters: Depende de la implementación, pero no se mencionó la asignación de heap. Solo lo mencionaba en caso de que se lo pasara por alto. – AJG85