Page 1 of 1

Consumo de CPU

Posted: Sat Jun 15, 2019 12:26 pm
by leandro
Buenos días para todos,

En los ejemplos que vienen en fw, hay unas funciones que verifican que puertos COM (seriales) estan activos, la compile y funciona de maravilla, la idea es detectar el puerto COM y guárdalo en una DBF, al inicio de la aplicación. En teoria hago eso, pero el problema radica en que parece que algo queda activo durante todo el tiempo que la aplicación está abierta y ese proceso consume toda la CPU del PC. ¿alguien a tenido el mismo problema?

Code: Select all

//----------------------------------------------------------------//
Function CommTest()
LOCAL cP, cR, j, i
LOCAL aSpd := { '9600' } 

LOCAL aDisponible:={}
LOCAL aNoDisponible:={}

FOR i = 1 TO 4
   cP := LTrim( Str( i ) )
   IF Empty( CommOpen( cP, aSpd[ 1 ] ) )
      CloseComm( nComm )
      FOR j = 1 TO Len( aSpd )
         cR := CommOpen( cP, aSpd[ j ] )
         IF Empty( cR )
            aadd(aDisponible,cP)
         ELSE
            aadd(aNoDisponible,cR)
         ENDIF
         CloseComm( nComm )
      NEXT
   ELSE
      aadd(aNoDisponible,cP)
   ENDIF
NEXT
Return aDisponible

//----------------------------------------------------------------//
Function CommOpen ( cPort, cSpeed )
LOCAL cDcb, cRv := '', cS := 'COM' + cPort + ':' + cSpeed + ',n,8,1'
nComm := OpenComm( 'COM' + cPort, 1024 , 128 )
IF nComm >= 0
   IF BuildCommDcb( cS, @cDcb ) 
      #ifdef __CLIPPER__
         IF SetCommState( cDcb )
      #else   
         IF SetCommState( nComm, cDcb )
      #endif   
         cRv := ''
      ELSE
         cRv := 'Failed to SetCommState on COM' + cPort + ' at ' + cSpeed
      ENDIF
   ELSE
      cRv := 'Failed to BuildCommDCB on COM' + cPort + ' at ' + cSpeed
   ENDIF
ELSE
   cRv := 'Failed to find COM' + cPort
ENDIF
Return cRv
 
Antes de Lanzar el proceso

Image

Después de correr proceso

Image

Re: Consumo de CPU

Posted: Sun Jun 16, 2019 5:26 am
by Antonio Linares
Leandro,

Si no corres ese proceso, desaparece ese consumo ?

Prueba a poner una llamada a SysRefresh() dentro del bucle

Re: Consumo de CPU

Posted: Mon Jun 17, 2019 5:24 pm
by leandro
Antonio buenos días
Si no corres ese proceso, desaparece ese consumo ?
Exacto, sin el proceso el consumo es del 0.87%, prácticamente nada.
Prueba a poner una llamada a SysRefresh() dentro del bucle
Agregue sysrefresh(), pero el consumo sigue muy alto.

Code: Select all

//----------------------------------------------------------------//
Function CommTest()
LOCAL cP, cR, j, i
LOCAL aSpd := { '9600' } 

LOCAL aDisponible:={}
LOCAL aNoDisponible:={}

FOR i = 1 TO 4
   cP := LTrim( Str( i ) )
   IF Empty( CommOpen( cP, aSpd[ 1 ] ) )
      CloseComm( nComm )
      FOR j = 1 TO Len( aSpd )
         cR := CommOpen( cP, aSpd[ j ] )
         IF Empty( cR )
            aadd(aDisponible,cP)
         ELSE
            aadd(aNoDisponible,cR)
         ENDIF
         CloseComm( nComm )

      NEXT
   ELSE
      aadd(aNoDisponible,cP)
   ENDIF
   SysRefresh()
NEXT
Return aDisponible
 
Image

Re: Consumo de CPU

Posted: Mon Jun 17, 2019 5:37 pm
by karinha
Intenta asi:

Code: Select all

FUNCTION CommTest()

   LOCAL cP, cR, j, i
   LOCAL aSpd := { '9600' }

   LOCAL aDisponible := {}
   LOCAL aNoDisponible := {}

   HB_GCALL( .F. )

   FOR i = 1 TO 4

      SYSREFRESH()

      cP := LTrim( Str( i ) )

      IF Empty( CommOpen( cP, aSpd[ 1 ] ) )

         CloseComm( nComm )

         FOR j = 1 TO Len( aSpd )

            SYSREFRESH()

            cR := CommOpen( cP, aSpd[ j ] )

            IF Empty( cR )
               aadd( aDisponible, cP )
            ELSE
               aadd( aNoDisponible, cR )
            ENDIF

            CloseComm( nComm )

         NEXT

      ELSE

         aadd( aNoDisponible, cP )

      ENDIF

   NEXT

RETURN aDisponible
 
Saludos.

Re: Consumo de CPU

Posted: Mon Jun 17, 2019 6:05 pm
by leandro
karinha, Gracias por responder

Si bajo una gran cantidad (56%), pero me sigue pareciendo alto el consumo, que opinas?

Image

Re: Consumo de CPU

Posted: Mon Jun 17, 2019 6:14 pm
by karinha
Leandro como haces la llamada a CommTest()?? és um WHILE... ENDDO??

Muestra...

Re: Consumo de CPU

Posted: Mon Jun 17, 2019 6:17 pm
by cnavarro
Leandro, pocas veces he utilizado este tema y además hace mucho tiempo, pero me llama la atención que abras y cierres con distinto handle, quizás se quede abierto, aunque seguramente no tenga nada que ver con el tema que te ocupa.

cR := CommOpen( cP, aSpd[ j ] ) // Aqui es cR

IF Empty( cR )
aadd( aDisponible, cP )
ELSE
aadd( aNoDisponible, cR )
ENDIF

CloseComm( nComm ) // Aqui es nComm

Re: Consumo de CPU

Posted: Tue Jun 18, 2019 10:37 pm
by leandro
Cristobal gracias por la sugerencia, quedo corregido :D

Pero tienes razón, el problema persiste. :(

Re: Consumo de CPU

Posted: Tue Jun 18, 2019 11:50 pm
by cnavarro
leandro wrote:Cristobal gracias por la sugerencia, quedo corregido :D

Pero tienes razón, el problema persiste. :(
Revisa todo tu código, para que no quede ningún handle abierto
Quieres decir que el consumo, después de haber arreglado lo anterior, es el mismo que antes?

Re: Consumo de CPU

Posted: Wed Jun 19, 2019 3:30 pm
by leandro
Exactamente el mismo :(