Colección de citas famosas - Slogan de motivación - Problemas al actualizar componentes COM

Problemas al actualizar componentes COM

Consulte su implementación.

El problema de mostrar y actualizar el valor de retorno del evento del componente COM, preguntó el cartel DoudouHorn en VC/MFC/ATL/ActiveX/COM abril de 2005-2000: 14:52.

Utilice VC para escribir un componente COM y llamarlo en el programa MFC de la biblioteca del cuadro de diálogo creada por otro VC.

Los componentes COM pueden devolver la información de progreso actual y los datos de operación al programa MFC de la biblioteca del cuadro de diálogo a través de eventos.

Quiero mostrar el progreso en el formulario en la respuesta del evento. , pero el formulario no actualizará el contenido mostrado hasta que el componente COM se esté ejecutando y la interfaz esté en un estado de bloqueo falso cuando el componente COM se esté ejecutando.

¿Cómo actualizar el formulario en tiempo real?

¡Código de ejemplo encontrado! Urgente, gracias!

Número de preguntas: 100, número de respuestas: 17.

Arriba

Jiang Sheng (江生.Net[MVP] en ​​el nivel 1) respondió el 20 de abril de 2005 a las 07:14:44, puntuación 0, agregado para componentes COM An Evento en progreso. El contenedor puede manejar este evento para actualizar la visualización.

Arriba

2F sinall() respondió a las 08:41:55 el 20 de abril de 2005, puntuación 0. Puede que haya algún problema con la idea del diseño.

La operación y la visualización del progreso son problemas de un solo subproceso, no de múltiples subprocesos.

¡Así que debes aumentar tu progreso mientras haces cálculos!

Por ejemplo:

for(I = 1;i<record count;i++)

{

//Realizar cálculo

//Aumentar progreso

}

Arriba

DoudouHorn en el 3er piso respondió 2005-04-20 15:52:54 anotó 0 Jiangsheng y sinall(). Parecía que hice lo que me dijeron, o tal vez no entendí. El código para mi componente COM es:

for(I = 1;i<record count;i++)

{

//cálculo

Fire_SetProgress(1);

}

A través del seguimiento, puedo recibir este evento en la parte del formulario MFC y luego crear un formulario de interfaz para asignarlo y mostrarlo.

m _ iProgress = i

actualizar datos (FALSE);

Pero cada vez debe esperar hasta que el bucle en el componente COM se complete por completo antes El formulario se actualizará mostrando el último yo.

Cuando el componente COM no está completamente completado, la interfaz estará en un falso estado de falla.

Disculpe, ¿cuál es mi problema? ¿Puedes darnos el código de la solución? Gracias

Arriba

Jiangsheng Jiangsheng 4to piso. Net [MVP]) respondió el 20 de abril de 2005, 20:28:20:20. Por favor distribuya el mensaje durante la operación.

for(I = 1;i<record count;i++)

{

//Calcular

Fire_SetProgress(1) ;

//GetMessage

//Mensaje de programación

}

Arriba

Quinto piso Doudou dou Horn (Dou Doujiao ) 20 de abril de 2005 22:02:05 respondió, puntuación 0 Jiang Sheng (Jiang Sheng. MSMVP enero de 2004) (

Soy un tonto, ¿puede darme "información de distribución durante la cirugía" "El código gracias.

Arriba

Doudou horn en el sexto piso respondió el 22 de abril de 2005 a las 19:26:26, 0 puntos. ¿Quién puede ayudar a responder esta pregunta? ¿Pregunta?

Arriba

Maix (Xiaoxiao) en el séptimo piso respondió a las 20:51:02 el 22 de abril de 2005, con una puntuación de 0. Ayude al hermano Jiang a agregar: si el contenedor necesita mostrar el progreso, el control COM debe activar eventos en cada lugar donde se deba mostrar el progreso, es decir, distribuir eventos. Por ejemplo, para mostrar el progreso de la descarga, puede dejar que el contenedor muestre el 10% y... ........ ........Es 20% a la vez Quiero saber si estoy claro

Top

8vo. Floor Doudou dou Horn (豆豆角) 23 de abril de 2005 00: 57: 19 respuestas, puntuación 0 maix (risas):

¿No es esta oración en el bucle for un evento desencadenante?

Fire_SetProgress(1);

¿O hay otro secreto?

Top

Xiao Yuzi en el noveno piso (Xiao Yuzi) respondió el 23 de abril. , 2005 a las 11:42:21 para agregar eventos al componente com Notificar al cliente cada vez que se completa una determinada tarea.

Arriba

Maix del Edificio 10 (risas) respondió el 23 de abril de 2005 a las +05:29:28. Una puntuación de 0 es para notificar al contenedor cuando COM se está ejecutando, simplemente llame a la función fire_XXXX en COM.

Top

11 Doudou dou Horn (dou dou Horn) respondió el 24 de abril de 2005 a las 02:06:09, puntuación 0. Chicos, usé eventos, pero realmente no funcionó.

El uso de eventos debería ser el mismo que todos dijeron, ¿no? Este es el código que mencioné en mi publicación anterior:

for(I = 1;i<record count;i++)

{

//Calcular

Fire_SetProgress(1);

}

Pero este código no funciona, al menos no aquí: (

Arriba

Jackieyoung (Lan Fan) en el piso 12 respondió el 27 de abril de 2005 a las 01:44:44, obteniendo 50 razones:

El hilo principal está ejecutando el bucle for Fire _ set Progress (I ); COM cuelga; COM usa un hilo en su propio grupo de hilos para la devolución de llamada de eventos, es decir, los datos de actualización (FALSE se llaman en este hilo). Además, la interfaz es mantenida por el hilo principal; está bloqueado en este momento (aunque el mensaje UpdateData se ha enviado al formulario en este momento), la interfaz no se puede actualizar

El estado de la última actualización se puede mostrar porque el hilo principal se basa en. último valor de m_iProgress y la cola de mensajes después de salir de for.

El método de Jiang Sheng (Jiang Sheng.MSMVP2004Jan) puede resolver los siguientes problemas:

for(I = 1;i<record count). ;i++ )

{

//Calcular

Fire_SetProgress(1);

//GetMessage

MSG MSG ;

GetMessage(&MSG,0,0,0);

//Mensaje de envío

mensaje de envío(amp;MSG);

// p>

}

Podría ser mejor abrir un nuevo hilo para llamar al bucle for en lugar de usar el hilo principal para poder usar su código original directamente.

Arriba

DoudouHorn en el piso 13 respondió a las 20:54:35 el 29 de abril de 2005, 0 Lanfan():

Abrir un nuevo hilo para llamar al bucle for puede llevar más tiempo que usar el hilo principal. Así que puedes usar tu código original directamente.

Probé este método y no sé por qué no funciona.

Es decir, se abre un nuevo hilo para llamar al componente COM, pero no se puede actualizar.

Además, ¿puede explicar el significado de las siguientes cuatro oraciones? usted

//GetMessage

MSG MSG

GetMessage(&MSG,0,0,0);

// Mensaje de envío

mensaje de envío(&MSG);

Top

Laker_tmj (Lakers) en el piso 14 respondió el 5 de mayo de 2005 a las 17:27 :27 y anotó 0 arriba aprender.

Arriba

Liu Fuweiming en el piso 15 respondió el 7 de mayo de 2005, con una puntuación de 30: 17: 18: 09. Creo que esta no es una buena manera de actualizar la interfaz:

Zhuxian City

//GetMessage

MSG MSG;

GetMessage (& amp;MSG,0,0,0);

//Mensaje de envío

mensaje de envío(amp;MSG);

GetMessage() La función es una llamada de bloqueo, por lo que algunos mensajes deben leerse de la cola de mensajes antes de regresar.

Si esta sección se agrega al hilo de cálculo, el cálculo será bastante lento incluso si no está bloqueado.

Recibir y distribuir mensajes requiere mucho tiempo.

Sería mejor iniciar un hilo de cálculo.

Cambie el progreso de la interfaz principal directamente en el hilo de cálculo en lugar de usar

GetMessage() y DispatchMessage().

Arriba

DoudouHorn (Doudou Horn) en el piso 16 respondió que a las 17:45:23 del 8 de mayo de 2005, su puntuación era 0 liufuweiming():

¿Cómo puedo cambiar directamente el progreso de la interfaz principal en el hilo de cálculo?