Page 1 of 1

Cancelar proceso en curso

Posted: Mon Nov 24, 2008 10:02 am
by jfafive
Hola!

En mi apliación, hay una función que tarda un rato en finalizar el proceso. Por eso, le he puesto un MsgRun con un texto de 'APLICACION EN PROCESO'

Mi pregunta es,
¿si el ususario desea cancelar el proceso en cualquier momento, hay algún modo de harcelo?

Gracias, y un saludo.
:)

Posted: Mon Nov 24, 2008 1:47 pm
by Antonio Linares
Javier,

La función TerminateProcess() podría servir:

http://msdn.microsoft.com/en-us/library ... S.85).aspx

Posted: Mon Nov 24, 2008 2:28 pm
by karinha
Prueba con este ejemplo.

http://www.fivewin.com.br/exibedicas.asp?id=681

Saludos.

Posted: Tue Nov 25, 2008 9:55 am
by jfafive
Gracias, pero creo que no me he explicado bien.

No quiero eliminar un proceso .EXE como si nos fueramos al administrador de tareas.

Lo que quiero es interrumpir una función que está ejecutandose para salir de ella y así volver al menú principal de la aplicación, y no, interrumpir la aplicación en si.

Karina, en tu ejemplo, creo que killprocess, lo que hace es cerrar la aplicación exe que se está ejecutando, con lo cual no me sirve.

Antonio, en tu ejemplo, no lo tengo claro. Pues viene escrito en visual C. De modo que no sé como podría usar tu ejemplo. :cry:

Posted: Tue Nov 25, 2008 10:21 am
by pymsoft
jfafive:


yo hago lo siguiente:

me creo una funcion que me muestra la evolucion de lo que estoy haciendo.

Code: Select all

***************
STATIC FUNCTION BoxStatus()
***************
LOCAL aStru

//  IF EMPTY( aStatus )
    aStatus := ARRAY(7)
    aStatus[7] := .F. // lCancel
//  ENDIF

  aStru := {}
  AADD( aStru, { "TESTO"  , "C", 120, 0  } )
  DbCreate( "status.dbf", aStru )

  select 0
  USE status NEW ALIAS status exclusive

  DEFINE DIALOG aStatus[1] NAME "DLG_ACQ_VEN_STATUS"

    REDEFINE LISTBOX aStatus[2];
      FIELDS status->testo;
      HEADERS "";
      ALIAS "status";
      ID 101 OF aStatus[1]

    REDEFINE METER aStatus[3] VAR aStatus[6] ID 102 OF aStatus[1]

    REDEFINE SAY aStatus[4] PROMPT "" ID 103 OF aStatus[1]

    REDEFINE BUTTON aStatus[5] ID 501 ACTION ( aStatus[7]:=.T., aStatus[1]:end() )

  ACTIVATE DIALOG aStatus[1] CENTER NOWAIT;
           VALID (aStatus[3]:end(), status->( dbCloseArea() ), FERASE( "status.dbf" ), .T. )

RETURN NIL
*
** BoxStatus

y luego la llamo desde mi funcion, aqui te escribo una parte para que te hagas una idea:

Code: Select all

    BoxStatus()

    aStatus[3]:SetTotal( nCorr )

    // nCorr = totale articoli che corrispondono con il filtro.

    nSecIni := SECONDS()
    nSecTot := nCorr * 3 // facciamo 3 secondi per fare il calcolo per ogni articolo o taglia trovata

    DO WHILE art->( !eof() ) .AND. !aStatus[7]

      InfStat("Che corrispondono con il filtro: " + NTRIM( nTrovatiConFiltro )  + " Art. att. " + art->cod )

      status->( add_rec() )
      REPLACE status->testo WITH art->cod + " - " + art->des
      status->( dbUnLock() )

        aStatus[4]:varput( " Tempo residuo: " + TimeAsString( nSecTot ) )
        aStatus[4]:refresh()
        aStatus[2]:goBottom()
        aStatus[2]:refresh()
..
..
    ENDDO

Cuando !aStatus[7] es falso, me salgo de mi funcion.

Espero te sirva la idea.


Saludos

Posted: Tue Nov 25, 2008 10:31 am
by Antonio Linares
Javier,

Lo que te indica Pedro, es la forma de hacerlo:

Code: Select all

while lSigue
   ... haz lo que sea
end
si lSigue cambia a .F. entonces se sale del bucle.

Posted: Tue Nov 25, 2008 7:06 pm
by jfafive
Ok,

Gracias por vuestros consejos.
Lo voy a poner en práctica a ver como va.

:wink:

Posted: Tue Nov 25, 2008 7:41 pm
by Patricio Avalos Aguirre
Hola

Lo otro que puedes hacer es usar la funcion GetKeyState..


Code: Select all

do while Eval( bBusqueda )

	if GetKeyState( 27 )
		if  MsgYesNo( "¿Ha presionado la tecla ESC, desea salir?", "Usuario" )
		      exit
		endif
	endif

    bla..bla..cl

enddo

Re: Cancelar proceso en curso

Posted: Thu Nov 27, 2008 10:25 pm
by FranciscoA
jfafive wrote:Hola!

En mi apliación, hay una función que tarda un rato en finalizar el proceso. Por eso, le he puesto un MsgRun con un texto de 'APLICACION EN PROCESO'

Mi pregunta es,
¿si el ususario desea cancelar el proceso en cualquier momento, hay algún modo de harcelo?

Gracias, y un saludo.
:)

Con la function MsgMeter() puedes hacerlo, ya que trae un botón "Cancel" que detiene el proceso. En source esta el codigo y lo puedes modificar a tus necesidades.

Saludos.