FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Problemas con creación de hilo
Hola amigos, tengo esto en un botón del form:
Código PHP:
Código PHP:
Código PHP:
Código PHP:
Código PHP:
Intenté poniendo después de crear el hilo con: Código PHP:
|
#2
|
||||
|
||||
No está nada claro cómo y cuando has creado el hilo, es decir, si el hilo es un TThread, puedes crearlo en suspensión o en ejecución directa. El Método Execute debe contener un bucle principal que se ejecutará durante toda la vida del thread, normalmente se coloca un semáforo (Terminated) para terminarlo. Una forna de detectar cuando el hilop se esta ejecutando, llamando hilo al código del bucle principal, es colocar una variable de control que puede ser Terminated u otra que diseñes. Esa variable puede ser booleana y actuar como semáforo que se activa cuando te interese y otras partes de la clase pueden consultar para actuar en consecuencia.
Saludos. |
#3
|
||||
|
||||
Mira creo que Windows 10 gestiona los hilos de manera distinta porque si lo ejecuto en XP va bien pero si lo ejecuto en Windows 10 no va bien y ademas de repente me ha dejado de funcionar CreateProcess, OpenProcess, y fopen que los uso para abrir el archivo para depurarlo, atachearlo, y mirar su md5 respectivamente.
Ademas me he dado cuenta de que al atachear al proceso en xp tengo el control del mismo entrando el el bucle del hilo pero de los breakponts nada de nada. Ademas ahora el antivirus que trae Windows 10 me lo reconoce como un virus "Trojan:Script/Conteban.A!ml" y de troyano no tiene nada jajaja. De locos vamos. Os pongo el proyecto con una pequeña aplicación que lo unico que hace es mostrar un MessageBox al darle al botón y la idea es poner un Breakpoint en MessageBoxA y cuando pare mostrar yo un mensaje pero no para https://mega.nz/file/Ukt0hSjZ#IKeNQt...6_XxZOLnthbibc El hilo no lo creo suspendido pero se ve que tendrá menos prisa que el resto en Windows 10 porque tengo que andar poniendo pausas por doquier y ni así se espabila. |
#4
|
||||
|
||||
No he visto ese código pero me inclino a pensar que estás usando variables compartidas entre threads lo que los convierte en inestables. LAs APIs CreateProcess, OpenProcess, y fopen son thread safe pero eso no implica que si compartes variables, provoquen el fallo. En el caso de abrir ficheros en modo no compartido está claro que distintos threads no los podarán tener abiertos al mismo tiempo. Si compartes los Handles, un thread pisa a otro. La comunicación d¡con a VCL no es ThreadSafe con lo que debes usar Synchronize. Tienes que ser muy cuidadoso y usar semáforos para sincronizarlo todo bien.
Saludos. |
#5
|
||||
|
||||
A ver si me puedes ayudar, el caso es que solo hay dos hilos, el principal y el del debuger. El principal crea al hilo del debuger y posteriormente llama a métodos del hilo del debuger los cuales necesitan acceder a unas estructuras y variables que se crean al inicio del execute del hilo con lo que se da a veces el caso de que el hilo principal va más rápido que el secundario y accede a las variables sin haberse creado antes en el hilo secundario. He estado buscando la manera de solucionar eso y no me sirve waitfor porque espera a que acabe el hilo y en este caso el secundario contiene el bucle de eventos del debuger con lo que no acabará. La solución que encontré es usar TEvent y usarlo en la zona de código que quiero que se ejecute en el hilo secundario para que asigne la memoria a las variables y que una vez hecho eso ya continúe el hilo principal pero solo he encontrado esto en español: https://elvex.ugr.es/decsai/builder/...rdination.html
Y no tengo nada claro como hacerlo. |
#6
|
||||
|
||||
Pero quizás tengas que preguntarte primero si en realidad te hacen falta dos hilos.
En caso afirmativo, una solución rápida es que las variables se creen en la clase TDebugger y se asignen en execute. Las variables que necesita leer el hilo principal siempre deben leerse con un método de TDebuger y a ser posible no deben ser asignadas mientras TDebugger se ejecuta. Puedes saber si la variable leída es válida dándole determinado valor en caso de no ser válido. Por ejemplo, puede ser un puntero inicializado a NULL en cuyo caso no trataras de leerlo, pero puedes hacer un bucle (con un sleep corto) hasta tener un valor correcto. También puedes controlarlas con otra variable que se pone a true cuando el valor es válido... WaitForSingleObject puede ser usado con otros tipos de Handle que no tienen que ser el Thread, puedes usar un Mutex o un Event. Estos también te pueden servir para poner el hilo a la espera. Todo depende de tu diseño particular. Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problemas para acceder a componenente de un Form desde un Hilo | NEG1414 | C++ Builder | 3 | 05-02-2015 11:19:10 |
Problemas con ejecución de hilo | GerTorresM | OOP | 3 | 23-10-2014 19:01:12 |
Problemas con un Hilo | aguml | C++ Builder | 10 | 08-03-2014 00:20:58 |
cuando llamo ejecutar un hilo dentro del proceso del hilo no lo hace | robertosc | Varios | 1 | 14-08-2007 22:11:09 |
|