Author | Topic: 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 | |
Jorge | Re: 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 > > > |