FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Como hago esto? multi thread?!?!
Tengo un problema, resulta que yo ejecuto un bucle usando un FOR y un REPEAT que dependiendo de el valor que tome una variable cumple las siguientes ordenes
Código:
repeat for w:=0 to ADOQuery1.RecordCount-1 do begin //mis sentencias..... end; x:=x-1; until x=0; Pero me pasa en un caso especial, en donde necesito que el Repeat sea infinito, es decir que nunca pare. Tambien puedo hacerlo asignandole una condición que nunca se va a cumplir y listo. Pero mi pregunta es la siguiente: como hago para detener un ciclo infinito? hacer una suerte de parada de emergencia, porque mientras se ejecuta el ciclo infinito, pierdo el control de la aplicacion, no lo puedo cortar con nada. Lo que pienso es que debo dejar residente en memoria la parada de emergencia antes de ejecutar el bucle infinito, no se si estoy en lo correcto. Alguien me puede dar una mano? Gracias igualmente
__________________
|
#2
|
|||
|
|||
dentro del bucle puedes usar el application.processmessages y con algun boton ayudado por una variable el break para salir del ciclo si lo quieres cortar
|
#3
|
||||
|
||||
Lo primero es permitir que la "parada" se produzca. Mientras ejecutas un bucle, el resto de la aplicación queda congelada, así que no podríamos indicarle que parase de ninguna manera, ni pulsando un botón, ni una tecla, etc ... así que tenemos que dejar "respirar" a la aplicación. Esto podemos hacerlo de 2 maneras diferentes: usando threads o metiendo dentro del bucle la función "Application.Processmessages".
Yo para un bucle que se tiene que ejecutar "indefinidamente", o por lo menos durante un largo periodo de tiempo, prefiero usar un thread. Este correría de forma paralela al resto de la aplicación. Dentro del thread haría algo como esto: De esta manera cuando quisiera finalizar el bucle solo tendría que llamar al método "Terminate" del TThread, y el se encargara de poner a TRUE la propiedad Terminated. Por ejemplo: Donde TMiThread seria una clase descendiente de TThread. |
#4
|
||||
|
||||
Me gusta lo del Thread pero realmente no logro hacerlo, no se donde debo meterlo.
Código:
procedure TSecuenciador.dxButton2Click(Sender: TObject); var MiTHread:TTHread; w,x:integer; begin if CheckBox1.Chequed=True //opcion de infinito o por bucles then begin //bucle infinito end else begin x:=StrToInt(SpinEdit1.Text); //bucle por ciclos repeat for w:=0 to ADOQuery1.RecordCount-1 do begin //mis sentencias..... end; x:=x-1; until x=0; end; end;
__________________
|
#5
|
||||
|
||||
dentro de la unidad el thread podrás encontrar el procedimiento execute, en el realizarás las operaciones y calculos que necesites. Es muy recomendable que utilices un thread para esto. ademas, al momento de hacer el llamado MiThread:= TMiThread.Create; tienes un parámetro llamado CreateSuspended, el cual le indica al sistema si el thread se ejecutará de inmediato luego de ser creado o tu lo iniciarás manualmente con el procedimiento Mithread.Resume;
Si alguna de las operaciones que necesitas son manipular los controles o componentes de algún formulario entonces debes de tener cuidado al utilizar el thread porque sino terminarás con un AccessViolation at .... Para evitar esto tiene que utilizar un procedimiento de la clase TThread llamado syncronize y su forma de utilizado es ...
De esta forma te evitaras los fastidios AccessViolatios. Esto es lo que te puedo decir por ahora, pero siempre ten cuidado con la sincronización porque puedes terminar con un grave bug dentro de tu aplicación. Última edición por Chris fecha: 16-04-2007 a las 21:10:20. |
#6
|
||||
|
||||
Cita:
Saludos
__________________
|
#7
|
||||
|
||||
Bueno, aqui te dejo un ejemplo muy simple de como usar un thread.
En el ejemplo anterior, hacemos sonar un pitido a intervalos de un segundo. Como ves, el bucle se tiene que insertar en el método "Execute" del TThread. |
#8
|
||||
|
||||
Gracias muchachos, al final logré solucionar el tema. Lo que encuentro interesante es la forma en que pueden dividirse las instrucciones. yo que hago programas para controlar hardware externo, me viene como anillo al dedo.
Saludos
__________________
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
¿Como hago esto? | IZO | API de Windows | 5 | 02-03-2007 20:37:38 |
Thread bendito thread...se me pierde la ventana | Seba.F1 | API de Windows | 5 | 02-02-2006 00:16:30 |
Como hago esto en Delphi ? | Markos1970 | OOP | 5 | 19-12-2005 15:40:29 |
como hago esto | meosre | MySQL | 3 | 06-10-2005 17:14:09 |
Base de datos multi área (multi departamento) | Al González | Conexión con bases de datos | 0 | 19-03-2004 16:27:14 |
|