Red de conocimiento informático - Problemas con los teléfonos móviles - Comunicación entre procesos de VC

Comunicación entre procesos de VC

Comunicación entre subprocesos

En términos generales, un subproceso secundario en una aplicación siempre realiza tareas específicas para el subproceso principal. De esta manera, debe haber alguna comunicación entre el subproceso principal y. el hilo secundario. Un canal para la transmisión de información, es decir, la comunicación entre el hilo principal y el hilo secundario. Este tipo de comunicación entre subprocesos no sólo es inevitable, sino también compleja y frecuente en la programación multiproceso, como se explicará a continuación.

Utilizar variables globales para la comunicación

Dado que cada hilo perteneciente a un mismo proceso comparte los recursos asignados por el sistema operativo al proceso, es la forma más sencilla de resolver el problema de inter -La comunicación por subprocesos utiliza variables globales. Para variables globales de tipo estándar, recomendamos usar el modificador volátil, que le dice al compilador que no es necesario realizar ninguna optimización en la variable, es decir, no es necesario colocarla en un registro y el valor puede ser cambiado externamente. Si la información que debe transferirse entre subprocesos es más compleja, podemos definir una estructura y transferir la información pasando un puntero a la estructura.

Uso de mensajes personalizados

Podemos enviar mensajes personalizados a otro hilo en la función de ejecución de un hilo para lograr propósitos de comunicación. El envío de mensajes de un hilo a otro se implementa a través del sistema operativo. Utilizando el mecanismo basado en mensajes del sistema operativo Windows, cuando un hilo envía un mensaje, el sistema operativo primero recibe el mensaje y luego lo reenvía al hilo de destino. El hilo que recibe el mensaje debe haber establecido un bucle de mensajes.

Rutina 7 MultiThread7

Esta rutina demuestra cómo utilizar mensajes personalizados para la comunicación entre subprocesos. Primero, el hilo principal envía el mensaje WM_CALCULATE al hilo CCalculateThread. El hilo CCalculateThread realiza cálculos después de recibir el mensaje y luego envía el mensaje WM_DISPLAY al hilo principal. Después de recibir el mensaje, el hilo principal muestra los resultados del cálculo.

Cree un proyecto basado en diálogo MultiThread7 y agregue tres botones de opción IDC_RADIO1, IDC_RADIO2, IDC_RADIO3 al cuadro de diálogo IDD_MULTITHREAD7_DIALOG, con títulos respectivamente 1 2 3 4... 10, 1 2 3 4... 50, 1 2 3 4... 100. Agregar botón IDC_SUM con título "Suma". Agregue el cuadro de etiqueta IDC_STATUS y seleccione "Borde" para el atributo

Defina las siguientes variables en MultiThread7Dlg.h: protected:

int nAddend; Representa el tamaño del sumando.

Haga doble clic en los tres botones de opción respectivamente y agregue la función de respuesta de mensaje: void CMultiThread7Dlg::OnRadio1()

{

nAddend=10

; p>

}

void CMultiThread7Dlg::OnRadio2()

{

nAddend=50

}

void CMultiThread7Dlg::OnRadio3()

{

nAddend=100

}

Y completa lo correspondiente en la función OnInitDialog Trabajo de inicialización: BOOL CMultiThread7Dlg::OnInitDialog()

{

……

((CButton*)GetDlgItem(IDC_RADIO1))-gt; SetCheck( TRUE);

nAddend=10;

......

Agregar MultiThread7Dlg.h: #include "CalculateThread.h"

#define WM_DISPLAY WM_USER 2

clase CMultiThread7Dlg: CDialog público

{

// Construcción

público:

CMultiThread7Dlg(CWnd* pParent = NULL); // constructor estándar

CCalculateThread* m_pCalculateThread;

……

protegido:

int nAddend;

LRESULT OnDisplay(WPARAM wParam, LPARAM lParam

......

Agregar MultiThread7Dlg. cpp: BEGIN_MESSAGE_MAP(CMultiThread7Dlg, CDialog)

......

ON_MESSAGE(WM_DISPLAY,OnDisplay)

END_MESSAGE_MAP()

LRESULT CMultiThread7Dlg::OnDisplay(WPARAM wParam, LPARAM lParam )

{

int nTemp=(int)wParam

SetDlgItemInt(IDC_STATUS, nTemp, FALSE; );

return 0;

}

El código anterior permite que la clase de hilo principal CMultiThread7Dlg procese el mensaje WM_DISPLAY, es decir, muestre los resultados del cálculo en el cuadro de etiqueta IDC_STATUS.

Haga doble clic en el botón IDC_SUM y agregue la función de respuesta al mensaje: void CMultiThread7Dlg::OnSum()

{

m_pCalculateThread=

(CCalculateThread* )AfxBeginThread(RUNTIME_CLASS(CCalculateThread));

Sleep(500);

m_pCalculateThread-gt; p>}

La función de la función OnSum() es establecer el hilo CalculateThread y retrasar el envío del mensaje WM_CALCULATE al hilo.

Haga clic derecho en el proyecto y seleccione "Nueva clase..." para agregar la clase base CWinThread y la clase de subproceso derivada CCalculateThread al proyecto.

Agregue #define WM_CALCULATE WM_USER 1 en el archivo CalculateThread.h

clase CCalculateThread: public CWinThread

{

……

…… p>

protegido:

afx_msg LONG OnCalculate(UINT wParam, LONG lParam);

……

Agregar LONG CCalculateThread en el archivo CalculateThread.cpp ::OnCalculate(UINT wParam, LONG lParam)

{

int nTmpt=0

for(int i=0; ; ilt; = (int) wParam; i )

{

nTmpt=nTmpt i

}

Dormir(500) ;

: PostMessage((HWND)(GetMainWnd()-gt; GetSafeHwnd()), WM_DISPLAY, nTmpt, NULL

devuelve

; }

BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)

//{{AFX_MSG_MAP(CCalculateThread)

// NOTA: ClassWizard agregará y eliminará macros de mapeo aquí.

//}}AFX_MSG_MAP

ON_THREAD_MESSAGE(WM_CALCULATE, OnCalculate)

//Compara con el hilo principal, presta atención a sus diferencias

END_MESSAGE_MAP()

Agregue una línea al principio del archivo CalculateThread.cpp: #include "MultiThread7Dlg.h"

El código anterior agrega el mensaje WM_CALCULATE a la clase CCalculateThread La función de respuesta del mensaje es OnCalculate y su función se basa en los parámetros. El valor de wParam se acumula. El resultado acumulado está en la variable temporal nTmpt. Después de un retraso de 0,5 segundos, se envía un mensaje WM_DISPLAY. El hilo principal para visualización. nTmpt se pasa como parámetro.

Compile y ejecute esta rutina para comprender cómo pasar mensajes entre hilos.