Hay algunas cosas que puede hacer.
(1) Se podría posterior el diálogo de un mensaje desde el interior del método CDialog :: OnInitDialog y luego manejar la función de tiempo en el controlador de mensajes de ese mensaje publicado. De esta forma, primero se mostrará el cuadro de diálogo y luego se ejecutará la función larga.
(2) La segunda opción es asegurarse de que el ciclo de mensajes obtiene algún tiempo de procesamiento. Así que si su función a largo es una especie de bucle sólo tiene que añadir la llamada ocasional a los ProcessMessages para asegurarse de que la cola de mensajes se mantiene vacío:
void ProcessMessages()
{
MSG msg;
CWinApp* pApp = AfxGetApp();
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
pApp->PumpMessage();
}
}
Editar: Sin duda, es posible utilizar hilos es tal una situación, pero hacerlo no siempre es sin riesgo y complejidad.
El uso de hilos con una interfaz gráfica de usuario significa tener que hacer frente a múltiples colas de mensajes que a su vez significa el uso de la API como PostThreadMessage y que introduce un nuevo conjunto de problemas que tener cuidado de.
Para un ejemplo de una de esas cuestiones se refieren a este enlace:
http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx
donde se dice:
Los mensajes enviados por PostThreadMessage son no asociado a una ventana. Como regla general , los mensajes que no están asociados con una ventana no pueden ser enviados por la función DispatchMessage . Por lo tanto, si el subproceso del destinatario está en un bucle modal (como se usa en MessageBox o DialogBox), se perderán los mensajes . Para interceptar mensajes de subproceso en un ciclo modal , utilice un enlace específico de subproceso.
uso el enfoque de mensaje de proceso en el Zeus IDE y funciona muy bien en asegurarse de que la interfaz gráfica de usuario se mantenga sensible para el usuario. También tiene la ventaja de ser muy fácil de implementar.
IMO la función ProcessMessage() es la forma de agregar capacidad de respuesta a una aplicación MFC. – Hapkido
Yo también usaría la opción ProcessMessage;) – jussij
Estoy totalmente en desacuerdo. 1) Un método de interfaz de usuario no debe realizar una gran cantidad de "otro" trabajo, las preocupaciones deben separarse. 2) Se puede usar un hilo de trabajo simple en la mayoría de estas situaciones, sin necesidad de múltiples bombas. ¿Por qué estás tratando de asustar al OP lejos de los hilos? –