StartThread NO es estable usando FiveWin

StartThread NO es estable usando FiveWin

Postby albeiroval » Wed Oct 03, 2018 2:00 pm

Buen dia,

Necesito ejecutar un proceso en un hilo (thread), no me sirve trabajarlo con TIMER.
La aplicacion al cabo de un tiempo se bloquea y un genera un GPF, estoy usando Harbour y Borland 7.0,
las librerias MT hbvmmt.lib de harbour y cw32mt.lib de Borland, este es el codigo :
Code: Select all  Expand view

nSeconds := 30
bThread  := {|oMsgItem, nSeconds| DownloadReportes( oMsgItem, nSeconds )}

ACTIVATE WINDOW oWnd;
        MAXIMIZED;
        VALID lExit;
        ON INIT ( OpenServerMySQL( oWnd ),;
                  Crear_AutoReporteZ(),;
                  MsgWinMainBar(),;
                  pThread := StartThread( bThread, oMsgItem, nSeconds ) )

StopThread( pThread )
WaitForThreads()

Return Nil


Function DownloadReportes( oMsgItem, nSeconds )
   
    DEFAULT nSeconds := 10
   
    nSeconds := nSeconds * 1000
       
    while .T.
   
      ExtraerReporteZ( oMsgItem )
           
        ThreadSleep( nSeconds )    
                       
  enddo
 
Return Nil
 
Last edited by albeiroval on Sun Oct 07, 2018 3:19 pm, edited 2 times in total.
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin ?

Postby vilian » Wed Oct 03, 2018 2:35 pm

Hi,
Yes, startThead works, but depend that you are using in your function (DownloadReportes())

Give a look at this link: http://www.kresin.ru/en/hrbfaq_3.html#Doc11, to understand thread better.
Sds,
Vilian F. Arraes
vilian@vfatec.com.br
Belém-Pa-Brazil
User avatar
vilian
 
Posts: 971
Joined: Wed Nov 09, 2005 2:17 am
Location: Brazil

Re: StartThread NO es estable usando FiveWin ?

Postby albeiroval » Wed Oct 03, 2018 3:03 pm

Vilian,

Gracias por responder, aqui el codigo de la funcion :
Code: Select all  Expand view

Function ExtraerReporteZ( oMsgItem )
    Local oQry
    Local oError
    Local cFechaini, cFechafin
    Local aDatos     := {}
    Local cSerial  := Serial_Fiscal()
    Local   cMessage := oMsgItem:cMsg
       
    TRY
        oQry = oSrv:FindRow( TABLA_AUTOREPORTE, "serial", cSerial, FALSE, FALSE )
        if oQry:RecCount() > 0
           aDatos := { oQry:procesado, oQry:periodo, oQry:serial, oQry:my_recno }
        endif
        oQry:End()
    CATCH   oError
      aDatos := {}
    END
   
    oMsgItem:nClrText = CLR_HRED
    oMsgItem:SetText( "DESCARGANDO REPORTES Z PERIODO DE IMPRESORA FISCAL = " + cSerial + " !!!" )
   
  if Len(aDatos) > 0
       if aDatos[1] == BFALSE
          cFechaini := Left( aDatos[2], 6 )
          cFechafin := SubStr( aDatos[2], 8, 6 )
          if TFHKA_UploadReportesZ( cFechaini, cFechafin, FALSE )
             oSrv:Updatehash( TABLA_AUTOREPORTE, { "procesado" => BTRUE }, "my_recno="+ClipValue2Sql(aDatos[4]) )
          endif  
       endif
    endif
       
    oMsgItem:nClrText = CLR_BLACK
    oMsgItem:SetText( cMessage )
               
Return Nil
 
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin ?

Postby albeiroval » Sat Oct 06, 2018 2:52 am

Amigos,

Viendo el link que me paso vilian hize cambios, pero tampoco es estable.
El programa trabaja 10 min y luego se congela y hay que cerrar el programa.
Este el codigo que probe
Code: Select all  Expand view


Function main()
...
if hb_mtvm()
         hb_threadStart( @DownloadReportesZ(), oMsgItem, 30 )
      endif  

...

static Function DownloadReportesZ( oMsgItem, nSeconds )
   
    DEFAULT nSeconds := 10
   
    WHILE TRUE
   
      ExtraerReporteZ( oMsgItem )
           
        hb_idleSleep( nSeconds )   
                       
  ENDDO
 
Return Nil

 


Segun lo que he leido en el foro los Threads !! AUN NO SON ESTABLES !!
Voy a tener que trabajar con un TIMER.
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin ?

Postby hmpaquito » Sat Oct 06, 2018 8:31 am

Hola,

Hasta donde yo sé los threads son estables siempre que no se incluya codigo GUI fivewin.Esto lo leí alguna vez. Hay muchos ejemplos de uso de threads sin GUIs, que según sus autores, funcionan perfectamente. Incluso el servidor http que tiene harbour en las contribs utiliza threads de forma masiva.

En alguna ocasión he necesitado algo consistente en lanzar un proceso aparte y que continue la ejecucion. Lo que hice fue una mega-chapu: re-invoco el ejecutable con un parametro que le indice que debe hacer la tarea y terminar. Esa invocación dejará resultados en una tabla que podrá ser leída por el programa llamante en el momento en que exista (aquí puede estar bien el timer). Las situaciones pueden tener diversas casuísticas. Se trataría de adaptar.

Saludos
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: StartThread NO es estable usando FiveWin ?

Postby albeiroval » Sun Oct 07, 2018 3:18 pm

hmpaquito,

Gracias por responder, es LAMENTABLE que fivewin no sea compatible o estable usando threads con
harbour. Los threads son una buena herramienta para ejecutar procesos en paralelo o multitareas,
he revisado codigo en "C" y logre hacer un thread usando un mensaje en "C" pero no logre llamar con exito
un codeblock usando "hb_evalBlock(", me generaba un GPF.

Tendre que usar TIMER, que no es lo ideal pero solventare el requerimento.
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin

Postby cnavarro » Sun Oct 07, 2018 6:16 pm

Bien, no es que esté utilizando de forma intensiva Multihilos en ejemplos de Fivewin, pero los que he realizado, ( incluyendo el servidor Http dentro de una ventana de Fivewin ), no me han producido ningún problema, incluso también incluyendo como prueba procesos modales en alguno de ellos, pero........., como digo no lo he probado en todos los escenarios posibles, así como tampoco conozco la forma en la que lo has implementado. Eso sí, creo recordar, que siempre los he utilizado una vez creada la ventana principal de la aplicación.
Esto me anima a dar prioridad a su implementación en FivEdit ( que ya tenía pensado hacer ), y, poder comentar mi experiencia
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6541
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: StartThread NO es estable usando FiveWin

Postby albeiroval » Sun Oct 07, 2018 9:49 pm

Hola navarro,

En este post puse el codigo con las dos maneras que probe para trabajar el multihilo,
uno al crear la windows principal (en el ON INIT) y otra antes de crearlo,
usando codeblock y otra usando puntero a funcion, con ninguna de la dos me fue bien,
inclusive bloqueando y desbloqueando el proceso con mutex,
Seria interesante y de gran ayuda si puedes poner un ejemplo funcional.

Gracias.
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin

Postby cnavarro » Sun Oct 07, 2018 10:10 pm

Qué versión de Fw y harbour utilizas?
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6541
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: StartThread NO es estable usando FiveWin

Postby albeiroval » Sun Oct 07, 2018 10:48 pm

Navarro, yo uso fwh 17.05 y harbour 3.2.0 dev(r1801051438)
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin

Postby Patricio Avalos Aguirre » Mon Oct 08, 2018 1:25 am

Hola Albeiro

prueba colocar una static en la funcion extaerreport..

Function ExtraerReporteZ( oMsgItem )
static lentre := .f.
Local oQry

if !lentre
lentre := .t.
bla
bla
lentre := .f.
endif
return..
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1060
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Re: StartThread NO es estable usando FiveWin

Postby albeiroval » Mon Oct 08, 2018 12:58 pm

Hola patricio,

El problema no esta en si la funcion ExtraerReporteZ(...) se ejecuta o no,
la funcion se debe ejecutar cada XX segundos, por eso es que quiero usar un hilo
y no un timer
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin

Postby darioflores » Mon Oct 08, 2018 2:09 pm

La ejecución de código a través de hilos tiene una serie de cuestiones a tener en cuenta, hay que reinventarse un poco en la forma de programar.

Te dejo un enlace al blog de Don Rafa Carmona, para que te hagas un poco a la idea de esas cuestiones.

http://xthefull.blogspot.com/2016/07/th ... vatos.html

Yo estoy utilizando hilos y no tengo problemas.


Un saludo.
darioflores
 
Posts: 17
Joined: Tue Oct 06, 2015 7:06 am

Re: StartThread NO es estable usando FiveWin

Postby albeiroval » Mon Oct 08, 2018 3:23 pm

dario,

Ese link ya lo revise hace dias, en este post hablo que he usado codeblocks y funciones para crear los hilos y
los mutex para bloquear y desbloquear un hilo, que en mi caso no necesitaria usarlo ya que solo voy a manejar un (1) solo hilo,
el cual se ejecuta cada XXX tiempo.

Ya que comentas que estas usando hilos sin problema podrias poner algo del codigo que usas para ver lo siguiente :
1- Como los creas
2- Como lo invocas
3- Como los cierras

Gracias
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 367
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: StartThread NO es estable usando FiveWin

Postby cnavarro » Mon Oct 08, 2018 3:36 pm

Aqui tienes un ejemplo sencillo

Code: Select all  Expand view

//----------------------------------------------------------------------------//
// Programa: TESTMT01.PRG
// Autor...: Cristobal Navarro
//----------------------------------------------------------------------------//

#include "Fivewin.ch"
#include "hbthread.ch"
#include "gif.ch"

Static oPnel1

Function Main()

   local oWnd
   local oBar
   local oBtt1
   local oBtt2
   local uTh1
   local uTh2
   local uTh3
   local nPress  := 0

    DEFINE DIALOG oWnd FROM 0, 0 TO 660, 1100 TITLE "Test" PIXEL //MDI

      DEFINE BUTTONBAR oBar SIZE 48, 48 OF oWnd 2015
      DEFINE BUTTON oBtt1 PROMPT "Salir" OF oBar ACTION oWnd:End() TOOLTIP "Salir"
      DEFINE BUTTON oBtt2 PROMPT "Test"  OF oBar ;
         ACTION ( nPress++, ;
                  uTh1 := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @WTest(), "Hello", 120, nPress ),;
                  uTh2 := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @WTest(), 333, 120, nPress ),;
                  MsgWait( "Process", "Modal", 5  ))
   
   ACTIVATE DIALOG oWnd ;
      ON INIT ( HazPnel( oWnd ), CrearGif( oWnd ) ) ;
      VALID ( hb_threadTerminateAll(), .T. )
//                  uTh3 := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @CrearGif(), oWnd ),;
Return NIL

//----------------------------------------------------------------------------//

Function WTest( u, nF, nPress )

   local x := 1
   if Valtype( u ) = "N"
      For x = 1 to 300 step 15
         @ nF + x, 60 + ( ( nPress - 1 ) * 110 ) SAY "Thread " + StrZero( nPress + 1, 2 ) ;
            OF oPnel1 PIXEL COLOR CLR_BLACK
         SysRefresh()
         hb_idleSleep( 0.8 )
      Next x
   else
      For x = 1 to 300 step 15
         @ nF + x, 4 + ( ( nPress - 1 ) * 110 ) SAY "Thread " + StrZero( nPress, 2 ) ;
            OF oPnel1 PIXEL COLOR CLR_RED
         SysRefresh()
         hb_idleSleep( 0.8 )
      Next x
   endif

Return nil

//----------------------------------------------------------------------------//

Function HazPnel( oWnd )

   @ 50, 400 PANEL oPnel1 OF oWnd SIZE 600, 550
   oPnel1:SetColor( CLR_BLACK, CLR_YELLOW )
   
Return oPnel1

//----------------------------------------------------------------------------//

Function CrearGif( oDlg )
   
   local oGif
   @ 60, 10 GIF oGif FILE "..\gifs\matrix.gif" OF oDlg SIZE 100, 100 //ADJUST //

Return nil

//----------------------------------------------------------------------------//
 


Si lo pruebas y es ESTABLE, por favor, coméntalo en el foro.
Aunque como he dicho anteriormente, y el compañero Dario creo que lo ha expresado también muy bien, depende del objetivo para el que lo uses y cómo lo implementes
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6541
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 23 guests