Alaska Software Inc. - Dos thread's
Username: Password:
AuthorTopic: Dos thread's
Osvaldo Ramirez Dos thread's
on Wed, 19 Dec 2007 13:09:43 -0700
Hola,

Este es mi problema:

Tengo un dialogo el cual al presionar un boton, yo mando llamar un
procedimiento para la generacion de un reporte.
Dicho procedimiento, puede tardar varios minutos, y lo que quiero
es: Que si el usuario decide cancelar dicho procedimiento lo pueda
cancelar.

Entonces me dije a mi mismo, "Mi mismo" pon un boton de cancelar y
pon un bandera; y luego en tu procedimiento o generacion de reporte
vez constantemente tu bandera para ver si hay que abortar.

Pense, esto esta de lujo, pero ... mi dialogo ya no procesa mas los
eventos hasta que termine mi proceso de reporte!!!
El cual es logico, Ahora, que debo hacer ?

Se me ocurrio poner entonces 2 hilos, uno para mi dialogo y el otro para 
mi proceso de reporte, pero, mi proceso de reporte requiere algunas 
variables privadas que yo defino al inicio de mi dialogo, pero tambien 
si el usuario decide cerrar mi dialogo, mi hilo del procedimiento del 
reporte queda en el limbo.

Quiero pregutarles a ud's que han echo para esto y si lo han echo de que
manera lo han solucionado. ?

Anexo mi procedimento de como es que tengo mis dialogo.

Saludos a todos y Felix- ( El Gato ) - Navidad
Osvaldo Ramirez



#include "xbp.ch"
#include "gra.ch"
#include "tools.ch"
#include "common.ch"
#include "topdown.ch"
#include "appevent.ch"

PROCEDURE PR_ZS( opcion )
* Begin

   LOCAL oDlg,oDa,oCtrl,oMsg1,ctitle
   LOCAL cfont := "10.Arial"   , aColors := {tdBLK,GRA_CLR_PALEGRAY}, 
nLenSay := 12

   PRIVATE dfecha1   := date()-1
   PRIVATE dfecha2   := date()-1
   PRIVATE nRows     := 17
   PRIVATE nCols     := 65
   PRIVATE cSuc
   PRIVATE oMle
   PRIVATE oUsarGrandote , aEditcontrols := {}

   cSuc := "50,51,52,53,501,502,504,505"+space(50)
   cTitle := "Relacion de Productos no ordenados y si se solicitaron"

   oDlg:= window(nrows,ncols,ctitle )
   oDlg:drawingArea:setColorBG(tdPGY)
   oDa := oDlg:drawingarea

   oMsg1 := tdStatBar( nrows - iif(_manifest_file,.2,0)  , 1 , oDa , 
ncols,,"10.Courier New")
   oMsg1 :setCaption("MENSAJE : Puede moverse con las teclas de 
direccion o Enter")

   box( oDa  , 1.5 , 1 ,nrows-3.7,ncols-.4 ,"Parametros ")

   say_in_win(oDa,02, 02, 'De la fecha :',nLenSay,"R",aColors,cfont )
   oGet := get_in_win(oDa,02, 15, @m->dfecha1,10,"@D")
   say_in_win(oDa,03, 02, 'Hasta la fecha :',nLenSay,"R",aColors,cfont )
   oGet := get_in_win(oDa,03, 15, 
@m->dfecha2,10,"@D","m->dfecha2>=m->dfecha1")
   say_in_win(oDa,04, 02, 'Sucursales :',nLenSay,"R",aColors,cfont )
   oGet := get_in_win(oDa,04, 15, @m->cSuc,45,"@!")

   tdLine(nRows-11.8,1.1,ncols-.6        ,oDa,'raised')

   oMle := tdMle(nRows-11.3,2,8.5,ncols-2,oDa)
   oMle:setData("")

   box( oDa , nrows - 1.8 ,ncols-30.5 , 1.5, 31 )
   PushButton(oDa ,nrows-1.5,ncols-30,10, BMP_PREVER  ,{|| 
PostAppEvent(xbeP_Close,,,oDlg) , FU_ZS("CON" , opcion , oDlg ) } )
   PushButton(oDa ,nrows-1.5,ncols-20,10, BMP_IMPRIMIR,{|| 
PostAppEvent(xbeP_Close,,,oDlg) , FU_ZS("LPT1", opcion , oDlg ) } )
   PushButton(oDa ,nrows-1.5,ncols-10,10, BMP_EXPORTAR,{|| 
PostAppEvent(xbeP_Close,,,oDlg) , FU_ZS("FILE", opcion , oDlg ) } )

   oUsarGrandote := tdRadChk(2,nCols-15, "cb","Usar 
Acumulados",oDa,,,"10.Arial",,{150,20})
   oUsarGrandote:selection :=.T.
   oUsarGrandote:create()

   oDlg:show()
   setAppFocus(oDlg)

   if valtype(oDlgMainScreen) = "O"
     BusyPointer(oDlgMainScreen,.f.)
   endif

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
   oCtrl:READ( 1 )


RETURN

FUNCTION FU_ZS( device , opcion , odlg )
* Begin
   LOCAL aSuc
   LOCAL info := ""
   LOCAL cfilter := ""
   LOCAL cfilter2 := ""
   LOCAL _file_temp
   LOCAL lUsarGrandote := oUsarGrandote:editbuffer()
   LOCAL cFilexls := Reportes_excel+"Productos NO Solicitados en POS 
"+str(day(dfecha1))+"-"+str(month(dfecha1))+"-"+str(year(dfecha1))+ " a 
la fecha " + ;
 
str(day(dfecha2))+"-"+str(month(dfecha2))+"-"+str(year(dfecha2))+ ".xls"


   IF empty(open_subschema(titles_dir+"pr_zs.vew"))
     RETURN NIL
   ENDIF

   cFilter := MakeFilter( cSuc , @aSuc )

   IF empty( cfilter )
     tdmsg({"Especifique las sucursales, separadas por comas (,)"," o 
bien, no repita los numero de sucursales"})
     RETURN .F.
   ENDIF

   cfilter2:= "tipo2='ORDEN'"  Aqui se va el tipo: ORDEN y ORDENBUENA

   oMle:Setdata( cFilter2  )

   * Verificar q exitan todos los diarios de todas las sucursales.
   ChkDays( aSuc , dFecha1 , dFecha2 , lUsarGrandote , @info )
   oMle:SetData( info )

   BusyPointer(oDlg,.t.)

   IF lUsarGrandote
     _file_temp := UneInformacionNew( 
dFecha1,dfecha2,cfilter,17,@info,cfilter2,temporal_dir)
   ELSE

     _file_temp := UneInformacion( 
dFecha1,dfecha2,cfilter,17,@info,cfilter2,temporal_dir)
   ENDIF

   close_schema()

   BusyPointer(oDlg,.f.)

   print_rr("Productos No ordenados en los POS",;
       reports_dir+"pr_zs.rrw",cfilexls,_file_temp)

RETURN NIL
JorgeRe: Dos thread's
on Tue, 06 May 2008 18:09:12 -0300
HolaOsvaldo,

quera saber sobre este caso porque no agregar un AppEvent() y un 
handleEvent() en tu rutina de reporte y as seguir controlando los eventos ?

saludos


"Osvaldo Ramirez" <ramirezosvaldo@prodigy.net.mx> escribi en el mensaje 
news:59241b7$1844d73c$11d18@news.alaska-software.com...
>
> Hola,
>
> Este es mi problema:
>
> Tengo un dialogo el cual al presionar un boton, yo mando llamar un
> procedimiento para la generacion de un reporte.
> Dicho procedimiento, puede tardar varios minutos, y lo que quiero
> es: Que si el usuario decide cancelar dicho procedimiento lo pueda
> cancelar.
>
> Entonces me dije a mi mismo, "Mi mismo" pon un boton de cancelar y
> pon un bandera; y luego en tu procedimiento o generacion de reporte
> vez constantemente tu bandera para ver si hay que abortar.
>
> Pense, esto esta de lujo, pero ... mi dialogo ya no procesa mas los
> eventos hasta que termine mi proceso de reporte!!!
> El cual es logico, Ahora, que debo hacer ?
>
> Se me ocurrio poner entonces 2 hilos, uno para mi dialogo y el otro para 
> mi proceso de reporte, pero, mi proceso de reporte requiere algunas 
> variables privadas que yo defino al inicio de mi dialogo, pero tambien si 
> el usuario decide cerrar mi dialogo, mi hilo del procedimiento del reporte 
> queda en el limbo.
>
> Quiero pregutarles a ud's que han echo para esto y si lo han echo de que
> manera lo han solucionado. ?
>
> Anexo mi procedimento de como es que tengo mis dialogo.
>
> Saludos a todos y Felix- ( El Gato ) - Navidad
> Osvaldo Ramirez
>
>
>
> #include "xbp.ch"
> #include "gra.ch"
> #include "tools.ch"
> #include "common.ch"
> #include "topdown.ch"
> #include "appevent.ch"
>
> PROCEDURE PR_ZS( opcion )
> * Begin
>
>   LOCAL oDlg,oDa,oCtrl,oMsg1,ctitle
>   LOCAL cfont := "10.Arial"   , aColors := {tdBLK,GRA_CLR_PALEGRAY}, 
> nLenSay := 12
>
>   PRIVATE dfecha1   := date()-1
>   PRIVATE dfecha2   := date()-1
>   PRIVATE nRows     := 17
>   PRIVATE nCols     := 65
>   PRIVATE cSuc
>   PRIVATE oMle
>   PRIVATE oUsarGrandote , aEditcontrols := {}
>
>   cSuc := "50,51,52,53,501,502,504,505"+space(50)
>   cTitle := "Relacion de Productos no ordenados y si se solicitaron"
>
>   oDlg:= window(nrows,ncols,ctitle )
>   oDlg:drawingArea:setColorBG(tdPGY)
>   oDa := oDlg:drawingarea
>
>   oMsg1 := tdStatBar( nrows - iif(_manifest_file,.2,0)  , 1 , oDa , 
> ncols,,"10.Courier New")
>   oMsg1 :setCaption("MENSAJE : Puede moverse con las teclas de direccion o 
> Enter")
>
>   box( oDa  , 1.5 , 1 ,nrows-3.7,ncols-.4 ,"Parametros ")
>
>   say_in_win(oDa,02, 02, 'De la fecha :',nLenSay,"R",aColors,cfont )
>   oGet := get_in_win(oDa,02, 15, @m->dfecha1,10,"@D")
>   say_in_win(oDa,03, 02, 'Hasta la fecha :',nLenSay,"R",aColors,cfont )
>   oGet := get_in_win(oDa,03, 15, 
> @m->dfecha2,10,"@D","m->dfecha2>=m->dfecha1")
>   say_in_win(oDa,04, 02, 'Sucursales :',nLenSay,"R",aColors,cfont )
>   oGet := get_in_win(oDa,04, 15, @m->cSuc,45,"@!")
>
>   tdLine(nRows-11.8,1.1,ncols-.6        ,oDa,'raised')
>
>   oMle := tdMle(nRows-11.3,2,8.5,ncols-2,oDa)
>   oMle:setData("")
>
>   box( oDa , nrows - 1.8 ,ncols-30.5 , 1.5, 31 )
>   PushButton(oDa ,nrows-1.5,ncols-30,10, BMP_PREVER  ,{|| 
> PostAppEvent(xbeP_Close,,,oDlg) , FU_ZS("CON" , opcion , oDlg ) } )
>   PushButton(oDa ,nrows-1.5,ncols-20,10, BMP_IMPRIMIR,{|| 
> PostAppEvent(xbeP_Close,,,oDlg) , FU_ZS("LPT1", opcion , oDlg ) } )
>   PushButton(oDa ,nrows-1.5,ncols-10,10, BMP_EXPORTAR,{|| 
> PostAppEvent(xbeP_Close,,,oDlg) , FU_ZS("FILE", opcion , oDlg ) } )
>
>   oUsarGrandote := tdRadChk(2,nCols-15, "cb","Usar 
> Acumulados",oDa,,,"10.Arial",,{150,20})
>   oUsarGrandote:selection :=.T.
>   oUsarGrandote:create()
>
>   oDlg:show()
>   setAppFocus(oDlg)
>
>   if valtype(oDlgMainScreen) = "O"
>     BusyPointer(oDlgMainScreen,.f.)
>   endif
>
>   oCtrl := XbpGetController():new( oDlg )
>   oCtrl:create()
>   oCtrl:READ( 1 )
>
>
> RETURN
>
> FUNCTION FU_ZS( device , opcion , odlg )
> * Begin
>   LOCAL aSuc
>   LOCAL info := ""
>   LOCAL cfilter := ""
>   LOCAL cfilter2 := ""
>   LOCAL _file_temp
>   LOCAL lUsarGrandote := oUsarGrandote:editbuffer()
>   LOCAL cFilexls := Reportes_excel+"Productos NO Solicitados en POS 
> "+str(day(dfecha1))+"-"+str(month(dfecha1))+"-"+str(year(dfecha1))+ " a la 
> fecha " + ;
>
> str(day(dfecha2))+"-"+str(month(dfecha2))+"-"+str(year(dfecha2))+ ".xls"
>
>
>   IF empty(open_subschema(titles_dir+"pr_zs.vew"))
>     RETURN NIL
>   ENDIF
>
>   cFilter := MakeFilter( cSuc , @aSuc )
>
>   IF empty( cfilter )
>     tdmsg({"Especifique las sucursales, separadas por comas (,)"," o bien, 
> no repita los numero de sucursales"})
>     RETURN .F.
>   ENDIF
>
>   cfilter2:= "tipo2='ORDEN'"  Aqui se va el tipo: ORDEN y ORDENBUENA
>
>   oMle:Setdata( cFilter2  )
>
>   * Verificar q exitan todos los diarios de todas las sucursales.
>   ChkDays( aSuc , dFecha1 , dFecha2 , lUsarGrandote , @info )
>   oMle:SetData( info )
>
>   BusyPointer(oDlg,.t.)
>
>   IF lUsarGrandote
>     _file_temp := UneInformacionNew( 
> dFecha1,dfecha2,cfilter,17,@info,cfilter2,temporal_dir)
>   ELSE
>
>     _file_temp := UneInformacion( 
> dFecha1,dfecha2,cfilter,17,@info,cfilter2,temporal_dir)
>   ENDIF
>
>   close_schema()
>
>   BusyPointer(oDlg,.f.)
>
>   print_rr("Productos No ordenados en los POS",;
>       reports_dir+"pr_zs.rrw",cfilexls,_file_temp)
>
> RETURN NIL
>
>
>