Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL v3 (V3L10, Win32)
PowerCOBOL v3 (V3L10, Win32) IDE Freeware compatible con Windows 7/8/10/11
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Herramienta] Como usar el método "SaveToImageFile" de ActiveX jotica PowerCOBOL (ActiveX, v4 - v11) 3 27 de agosto de 2024 11:18
[Sintaxis] ODBC - cambiar el "path" de una base de datos Hrmcobol PowerCOBOL (ActiveX, v4 - v11) 9 15 de noviembre de 2022 20:24
[Duda] Call "CFURCOV" System error occurred. code = 0x25 dmosca PowerCOBOL (ActiveX, v4 - v11) 19 6 de agosto de 2019 15:29
China quiere lanzar una "luna artificial" en 2020 Kuk Charladero - espacio libre 0 20 de octubre de 2018 21:52
[Sintaxis] Error MOVE "Parent" de un nodo "Root" en TreeView dmosca PowerCOBOL (ActiveX, v4 - v11) 1 23 de agosto de 2017 08:47

Respuesta

  #1
Antiguo 25 de agosto de 2015, 19:39
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207
Predeterminado Método "ThruEvents"
0 Inactivo Inactivo

Amigos, he visto que los Forms del Power 3 no tienen método "ThruEvents" (o lo que es lomismo en Borland/Embarcadero el método "Update").

Cómo solucionáis este tema en los bucles?

Si no hay solución, habrá que acudir a WinAPI "InvalidateRect" + "UpdateWindow" o algo así (nunca lo he necesitado, no sé cómo va exactamente)...

Añadido despues de 1 hora 12 minutos
He encontrado la solución! El equivalente el "ThruEvents" serían 2 llamadas a WinAPI:

Código COBOL:
  1.          MOVE "InvalidateRect" TO FUNC
  2.          
  3.          CALL FUNC WITH STDCALL USING BY VALUE hWnd
  4.                                       BY VALUE 0
  5.                                       BY VALUE 1
  6.          
  7.          MOVE "UpdateWindow" TO FUNC
  8.          
  9.          CALL FUNC WITH STDCALL USING BY VALUE hWnd



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick

Última edición por Kuk fecha: 11 de mayo de 2017 a las 15:32.
Kuk is offline   Responder Con Cita
  #2
Antiguo 25 de agosto de 2015, 23:57
Rapinto
Gran amigo del Foro
Guru de COBOL
Activista del Foro: Activista del Foro - Issue reason: ¡Gracias! Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por ayudar mucho a los foreros Guru de los Gurus: Por solidos y amplios conocimientos - Issue reason: Por saber demasiado! 
Última Actividad 29.01.2018 20:23
Posts Posts: 240
Likes enviados Enviados: 19
Likes recibidos Recibidos: 224

Kuk,

Só queria deixar a minha opinião sobre este assunto.

A minha ideia sobre "ThruEvents" ou "Doevents" em VB6, é que a rotina que está a ser executada, deixa de ser executada e todos os eventos pendentes são processados. Em seguida retorna ao ponto onde estava.
Um exemplo concreto:

Estás a executar o código no evento "Click" dum botão.
Código COBOL:
  1. MOVE A TO B.
  2. COMPUTE A = B + C
  3. INVOKE POW-SELF "THRUEVENTS"
  4.  
  5. IF A NOT = ZERO    .....

Quando é executado o THRUEVENTS, a instrução IF a seguir não é logo executada.
Se o operador tivesse entretanto feito um click numa listview, esse código começava a ser executado por causa do THRUEVENTS e só depois regressava á instrução IF a seguir.

A opinião geral de muitos programadores é que se deve evitar o uso do THRUEVENTS, pois deixamos de ter um controlo rigoroso do que se está a executar.

Se tiveres o FujitsuCobol ver. 9, podes testar isto que eu digo.
Por outro lado, as instruções de CALL que estás a utilizar, parecem-me mais a instrução do COBOL9: INVOKE POW-SELF "REFRESH" (mas posso estar enganado).

Citado de Microsoft MSDN (DoEvents em VB6 = ThruEvents em COBOL):

Cita:
DoEvents passes control to the operating system. Control is returned after the operating system has finished processing the events in its queue and all keys in the SendKeys queue have been sent.

DoEvents is most useful for simple things like allowing a user to cancel a process after it has started, for example a search for a file. For long-running processes, yielding the processor is better accomplished by using a Timer or delegating the task to an ActiveX EXE component.. In the latter case, the task can continue completely independent of your application, and the operating system takes case of multitasking and time slicing.

Caution Any time you temporarily yield the processor within an event procedure, make sure the procedure is not executed again from a different part of your code before the first call returns; this could cause unpredictable results. In addition, do not use DoEvents if other applications could possibly interact with your procedure in unforeseen ways during the time you have yielded control.
Espero que esta pequena explicação possa ajudar alguém aqui no foro.

Un saludo, Rui Pinto
Rapinto is offline   Responder Con Cita
  #3
Antiguo 26 de agosto de 2015, 09:18
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Rapinto, gracias por esta info. Yo lo sabía, pero uso bastante el ThruEvents en los bucles, donde actualizo un ProgressBar o casos similares. El método Refresh no hace nada (al menos yo siempre que lo he usado no ha hecho nada)...

Normalmente uso el ThruEvents antes del END-PERFORM.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #4
Antiguo 26 de agosto de 2015, 10:31
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

Citación del post de Kuk Ver Mensaje
Rapinto, gracias por esta info. Yo lo sabía, pero uso bastante el ThruEvents en los bucles, donde actualizo un ProgressBar o casos similares. El método Refresh no hace nada (al menos yo siempre que lo he usado no ha hecho nada)...

Normalmente uso el ThruEvents antes del END-PERFORM.
¿ Y no te ralentiza el programa, ni te hace "pirulas" raras ?, porque lo que haces es forzar a que todos los subprocesos pendientes, se ejecuten, ¿no?

Un saludo.-
Josber is offline   Responder Con Cita
  #5
Antiguo 26 de agosto de 2015, 18:08
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Citación del post de Josber Ver Mensaje
¿ Y no te ralentiza el programa, ni te hace "pirulas" raras ?, porque lo que haces es forzar a que todos los subprocesos pendientes, se ejecuten, ¿no?
Sií que ralentiza un poco, pero no mucho (depende del tamaño de los datos). Pero esto se puede controlar, si hay muchos datos, haces ThruEvents cada x registros (como lo que hacemos con COMMIT en BBDD).

Si lo usas bien, no da ningún problema. Mira, estoy en un tratamiento "masivo" de datos con un bucle, lo que hago es dehabilitar el Form (propiedad "Enabled") y para mejor viasualización - puntero de espera. De esta manera, el usuario no puede lanzar subprocesos agenos. Luego, dentro del bucle, al final de cada iteración meto el ThruEvents. Esto lo que hace es ejecutar los procesos pendientes, pero únicos que hay son lo que yo manejo (el ProgressBar, un CmStatic etc.). De esta manera, no me ejecuta la siguiente iteración del bucle hasta que no redibuje la pantalla con los nuevos datos.

El unico proceso "incontrolable" que queda es el foco de la ventana en sí, pero se control por Windows. Así que si WIndows ha ordenado enfocar o desenfocar la ventana, es justo en el ThruEvents donde lo veríamos "bien" (a tiempo).



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
Respuesta


Herramientas

Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:42.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.