FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Threads en unit
Hola , estoy haciendo una unit que hace multithreading , el codigo de la unit :
Debe funcionar tanto en aplicaciones graficas como en consola , lamentablemente estoy mejorandola para que funcione en consolas , el codigo de la consola.
Funciona , pero entra en un ciclo infinito :
Intente checkeando que verificara la cantidad de threads y ahi terminara :
Pero si hago esto no se ejecuta ningun thread. ¿ Alguien podria ayudarme ? |
#2
|
||||
|
||||
Pensaría que quizá necesitas hacer un decremento de fThreadRefCount en el ciclo:
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
#3
|
||||
|
||||
No entiendo nada de tu codigo
Por que usas un Syncronize para ejecutar un ShellExecute? Eso ya esta creando un proceso externo a tu aplicacion, no hace falta que sincronices nada Por que el Application.ProcessMessages? Por que el CheckSynchronize? |
#4
|
||||
|
||||
Bueno, me hago las mismas preguntas, aunque asumí que son "para algo" y ya, por eso mi respuesta.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
#5
|
||||
|
||||
Para aplicaciones de consola, si se debe usar CheckSynchronize
Lee la documentacion Es necesario asignar el valor del metodo a WakeMainThread El problema es que desde una aplicacion con interfaz grafica no deberias tocar esa variable, y usar TThread.Syncronize Yo me replantearia el diseño |
#6
|
|||
|
|||
El shellexecute es solo un ejemplo , en esa parte del codigo va todo el funcionamiento o el codigo que agregare en el futuro.Estoy estudiando multithreads pero hay muy pocos ejemplos.
|
#7
|
|||
|
|||
Perdon , hago otro post porque me olvide de un detalle importante , uso Synchronize porque estoy usandolo en una consola.
|
#8
|
||||
|
||||
ShellExecute es asincronico, no te sirve para aprender threads
Mejor pon un for de i hasta algun numero muy grande, por ejemplo algun int64 |
#9
|
|||
|
|||
Ok , pero el tema principal como lo soluciono ? , intente como dijo jhonny pero aun asi vuelve a lo mismo , o se vuelve eterno o no se ejecuta ninguno.
|
#10
|
||||
|
||||
Ok esto es muy interesante, admito como siempre que multithreading es dificil y me cuesta dominarlo. Pero encima en consola es distinto porque se te cierra el programa
Esto es lo que invente, es bastante "versatil" Clase que hereda de TThread:
Basicamente cuenta desde 0 hasta el numero que le decimos en el constructor En el metodo Execute que es reimplementado, imprime el "nombre" y el numero actual en la salida estandar, usando Syncronize El programa principal crea dos TThreadInutiles, los cuales inician apenas termina su correspondiente constructor. Luego, hay una pequeña clase TInformador porque el evento OnTerminate es de tipo TNotifyEvent y para agregarle un manejador hay que tener un objeto (TNotifyEvent es un procedure of object, no podes poner un procedimiento suelto, a menos no de forma idiomatica) El informador recibe la notificacion cuando cada hilo termina su trabajo, y si es el "t1", le agrego una lectura de entrada estandar pidiendo un numero: si es 0 le pedimos al t2 que termine, sino que continue Hay que consultar el estado de los Thread, si estan trabajando (propiedad Booleana Finished) y si alguno esta haciendo algo, es necesario invocar a CheckSyncronize
|
#11
|
|||
|
|||
Te agradezco la ayuda AgustinOrtu , encontre una solucion poco elegante para mi codigo , uso una variable global que incremento en el TThread.Synchronize , entonces en el odioso bucle while , pongo una condicion donde si la variable global es igual al count hace un break y listo.Ahora me fijo como le puedo agregar un for a tu codigo para hacer multithreading.
gracias por la ayuda. |
#12
|
||||
|
||||
Yo sigo pensando que esta mal planteado tu codigo
En el ejemplo cree dos threads, queres crear mas con un for, entonces create una estructura de threads (lista, pila, cola, arreglo, lo que quieras) y los vas metiendo ahi No es correcto usar Application.ProcessMessages en una aplicacion de consola, eso se usa desde una aplicacion VCL El codigo no es seguro y cuando falle, la razon va a estar enterrada muy dentro y muy dificil de ver Una variable global es un problema cuando usas thread por que el acceso tiene que ser sincronizado, no solamente la vas a usar para lectura sino que tambien la queres modificar |
#13
|
|||
|
|||
¿Qué problema estás tratando de solucionar?
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
mostrar 2 raise de una unit dentro de un try except de otra unit fuera del IDE | fcios | Varios | 1 | 31-12-2015 12:05:20 |
Threads y DataModule | brandolin | OOP | 5 | 20-10-2011 21:33:31 |
uso de threads | JULIPO | API de Windows | 2 | 25-07-2007 16:09:06 |
Threads in DLL's | Gianni | Varios | 0 | 20-07-2007 22:18:23 |
Threads y transacciones | anduj | Conexión con bases de datos | 5 | 12-07-2005 20:31:40 |
|