2011-09-20 23 views
5

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?

+0

¿Desea crear algo en un hilo y luego eliminarlo en otro y no ve ningún problema con esa idea? – AJG85

+1

@AJG: no es problema para 'new' /' delete'. Completamente razonable preguntarse sobre otros recursos. – MSalters

+0

@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

Respuesta

6

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.

+4

¿Cuido de los downvoter les gusta comentar? –

+0

Llegó un tipo y rechazó todo con una flecha hacia abajo en esta página, intenté deshacerlo –

+1

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

2

No, no hay comprobación de simultaneidad en esas llamadas.

9

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.

+0

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 –

+0

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

+0

Esta es la mejor respuesta, porque el envío de mensajes es lo que me interesa. –

2

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.

+0

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

Cuestiones relacionadas