Ejemplo MTMDI: ilustra el uso de un subproceso de interfaz de usuario MFC

Actualización: noviembre 2007

El ejemplo MTMDI ilustra el uso de un subproceso de interfaz de usuario de MFC en el que los eventos de interfaz de usuario se procesan en un subproceso independiente del subproceso de la aplicación principal. Este ejemplo es una versión modificada del ejemplo de un solo subproceso, MDI.

MTMDI no requiere una razón fundamental para asignar la ventana con la esfera en movimiento en un subproceso independiente. Un usuario no notará la diferencia entre los ejemplos MDI y MTMDI en un equipo con un solo procesador. Incluso en un equipo con varios procesadores, el usuario no podría detectar la diferencia, puesto que el movimiento de la esfera se basa en un temporizador de ventana.

No obstante, MTMDI ilustra técnicas para implementar un subproceso de interfaz de usuario MFC. Compare el código fuente de los ejemplos MDI y MTMDI para estudiar la sobrecarga de programación asociada al uso de los subprocesos de la interfaz de usuario MFC.

La sobrecarga de programación de MTMDI es una advertencia de que para utilizar un subproceso de interfaz de usuario hay que tener buenas razones que justifiquen el costo. El tipo más común de subproceso de MFC es el subproceso de trabajo, que se ilustra en el ejemplo MTRECALC.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar el ejemplo MTMDI

  1. Abra la solución MtMdi.sln.

  2. En el menú Generar, haga clic en Generar.

  3. En el menú Depurar, haga clic en Iniciar sin depurar.

Puede utilizar el menú File para crear ventanas nuevas de dos tipos diferentes. Cuando se crean las ventanas, la aplicación le permite cambiar los atributos de los elementos de la ventana mediante comandos de los menús: Color, Speed, Window y Help. Tenga en cuenta que las ventanas "Hello!" no tienen un menú Speed.

MTMDI utiliza su propia clase derivada de CWinThread, denominada CBounceThread. CBounceThread se implementa en el archivo Mtbounce.cpp. El subproceso contiene todo el código de dibujo y de temporizador que necesita la ventana en la que rebota la esfera para la animación.

La aplicación crea cada subproceso de la misma manera que se crea cada ventana MDI secundaria. Esto sucede en la función CBounceMDIChildWnd::Create, que se encuentra en Bounce.cpp. Esta función crea la ventana y el subproceso, asociando el subproceso a la ventana.

Siempre que cierre una ventana de vista del movimiento de rebote de la esfera, se destruye automáticamente el subproceso asociado. Las ventanas "Hello!" no tienen un subproceso propio; sus mensajes los controla el subproceso principal de la aplicación.

Palabras clave

En este ejemplo, se muestra el uso de las siguientes palabras clave:

AfxGetInstanceHandle; AfxMessageBox; AfxRegisterWndClass; CBitmap::CreateCompatibleBitmap; CCmdTarget::OnCmdMsg; CCmdUI::SetCheck; CColorDialog::DoModal; CColorDialog::GetColor; CDC::BitBlt; CDC::CreateCompatibleDC; CDC::DeleteDC; CDC::DrawText; CDC::Ellipse; CDC::FillRect; CDC::GetDeviceCaps; CDC::SelectObject; CDC::SetBkColor; CDC::SetTextColor; CFrameWnd::LoadFrame; CFrameWnd::rectDefault; CGdiObject::DeleteObject; CMDIChildWnd::Create; CMenu::LoadMenu; CRect::Height; CRect::Width; CWinApp::ExitInstance; CWinApp::InitInstance; CWnd::Create; CWnd::DestroyWindow; CWnd::GetClientRect; CWnd::GetCurrentMessage; CWnd::GetDC; CWnd::GetDlgItem; CWnd::GetWindow; CWnd::Invalidate; CWnd::KillTimer; CWnd::MessageBox; CWnd::OnCreate; CWnd::OnDestroy; CWnd::OnLButtonDown; CWnd::OnPaint; CWnd::OnSize; CWnd::OnTimer; CWnd::ReleaseDC; CWnd::SendMessage; CWnd::SetTimer; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::UpdateWindow; CloseHandle; CreateEvent; CreateThread; EnumChildWindows; GetSysColor; GetVersion; LOWORD; LoadCursor; LoadIcon; LoadMenu; MAKEINTRESOURCE; RGB; SetEvent; Sleep; WaitForSingleObject; max; min

Nota:

Algunos ejemplos, como éste, no se han modificado para reflejar los cambios en los asistentes, las bibliotecas y el compilador de Visual C++, pero, aun así, muestran cómo realizar la tarea deseada.

Vea también

Otros recursos

Ejemplos de MFC