![]() |
![]() |
| Paypal | 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
|
||||
|
||||
|
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. |
|
#2
|
||||
|
||||
|
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. |
|
#3
|
||||
|
||||
|
creo que TEvent es lo mejor pero no se como se usa. Tengo esto.
En el archivo TDebuger.h: Código PHP:
Código PHP:
Código PHP:
Código PHP:
|
|
#4
|
||||
|
||||
|
SetEvent lo señaliza de forma que WaitForSingleObject(hEvent, INFINITE) deja de esperar. por ejemplo.
Si usas TEvent, WaitFor haría lo mismo. Es una forma de hacer esperar hasta que algo señaliza el evento. Saludos. |
|
#5
|
||||
|
||||
|
Si, eso ya lo vi pero el caso es que al ejecutar el constructor me da NULL si lo declaró en TDebugger.h y me da un valor diferente de NULL si lo hago en TDebugger.cpp. No entiendo porque pasa eso sí Tdebugger.h se incluye en TDebugger.cpp.
|
|
#6
|
||||
|
||||
|
Me he dado cuenta que si la declaro como:
Código PHP:
![]() |
|
#7
|
||||
|
||||
|
Es buena idea declararla static de la clase pero entonces no la inicializa el constructor de la misma. Deber incluir en la parte de código esa inicialización. Lee sobre los miembros estáticos de un a clase en CPP. Son miembros que no pertenecen al objeto, sino a la clase misma por lo que existen siempre aún sin instanciar ningún objeto. Se puede acceder a ellos a través del nombre de la clase o desde un objeto.
En debugger.h Código PHP:
Código PHP:
Saludos. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|