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 los hilos en Builder
Hola amigos, aqui otra vez con problemas .
El problema que tengo ahora es que estoy probando el manejo de un hilo y si uso Terminate() y FreeOnTerminate = true le doy y se termina el hilo y se destruye pero, si uso Suspend() el hilo no se detiene y sigue trabajando. Probé a poner FreeOnTerminate = false y usar WaitFor() despues de Suspend(), Resume(), o Terminate() pero me encuentro con que ejecuta cualquiera de esas lineas y llega al WaitFor() y se queda congelado todo, tanto el interfaz como el hilo. No se por qué pasa esto y ademas tuve que poner un Application->ProcessMessage() para que procese los mensajes y me deje trabajar sobre el form para poder pulsar los botones ya que si no es así no me deja hacer nada y el form se congela mientras corre el hilo ¿no se supone que los hilos son entre otras cosas para evitar eso? Es muy cortito asi que lo pongo aquí: THilo.cpp: Código:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "THilo.h" #include "Unit1.h" #pragma package(smart_init) __fastcall THilo::THilo(bool CreateSuspended) : TThread(CreateSuspended) { Priority = tpNormal; FreeOnTerminate = false; } //--------------------------------------------------------------------------- void __fastcall THilo::Execute() { Synchronize(Bucle); } //--------------------------------------------------------------------------- void __fastcall THilo::Bucle() { while(!Terminated) { Form1->Caption = Form1->Caption.ToDouble() + 1; Application->ProcessMessages(); Sleep(1000); } } Código:
//--------------------------------------------------------------------------- #ifndef THiloH #define THiloH //--------------------------------------------------------------------------- #include <Classes.hpp> //--------------------------------------------------------------------------- class THilo : public TThread { private: protected: void __fastcall Execute(); void __fastcall THilo::Bucle(); public: __fastcall THilo(bool CreateSuspended); }; //--------------------------------------------------------------------------- #endif Código:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "THilo.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; THilo *Hilo; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonCrearClick(TObject *Sender) { Hilo = new THilo(false); ButtonCrear->Enabled = false; ButtonPausa->Enabled = true; ButtonAbortar->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonContinuarClick(TObject *Sender) { Hilo->Resume(); Hilo->WaitFor(); ButtonContinuar->Enabled = false; ButtonPausa->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonPausaClick(TObject *Sender) { Hilo->Suspend(); Hilo->WaitFor(); ButtonContinuar->Enabled = true; ButtonPausa->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonAbortarClick(TObject *Sender) { Hilo->Terminate(); Hilo->WaitFor(); delete Hilo; ButtonCrear->Enabled = true; ButtonPausa->Enabled = false; ButtonContinuar->Enabled = false; ButtonAbortar->Enabled = false; } //--------------------------------------------------------------------------- Estas cosas no me pasan usando las Apis de windows ResumeThread(), SuspendThread(), CreateThread(), y TerminateThread() ¿por que pasa con el que nos da Borland? |
#2
|
||||
|
||||
Acabo de ver que es un problema con Synchronize(), o sea, si uso Synchronize no me funciona ni Resume(), ni Suspend(), WaitFor(). Pero creo que voy a necesitar del uso de Synchronize ¿como lo hago?
|
#3
|
||||
|
||||
bueno ya lo conseguí. Me explicaron que es porque Synchronize es para sincronizar entre hilos y que no habia que usarlo para todo y despues de algunos cambios ya fue. Ahora me encuentro con otro problema, necesito pasar variables desde donde creo el hilo hasta el execute y que dichas variables esten accesibles en ambos sitios. No puedo usar variables globales. ¿Como le puedo pasar variables al hilo? Con THilo hilo = new *THilo() solo puedo pasarle el estado al crearse. Probé a pasarle mas variables modificandola en la clase y me daba un error sobre que estaba haciendo una funcion abstracta o algo asi.
|
#4
|
||||
|
||||
Ahora me encuentro con otro problema, tengo usa serie de funciones en unit1 y quiero ejecutarlas desde el hilo pero por supuesto el hilo no sabe ni que existen ¿como hago para poder ejecutarlas desde el hilo?
|
#5
|
||||
|
||||
Cita:
Saludos. |
#6
|
||||
|
||||
No me funciona o no se como hacerlo. Tengo esto en el Execute del hilo:
Código:
case EXCEPTION_SINGLE_STEP: if(FuncSingleStep != NULL) { try{ FuncSingleStep(); } catch(...){ } } dwContinueStatus = OnSingleStep(&DebugEv); break; case EXCEPTION_GUARD_PAGE_VIOLATION: dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED; break; y en el .h donde están las funciones tengo esto: Código:
#include <vcl.h> #include "THiloDebugger.h" #ifndef DEBUGGERH #define DEBUGGERH #define EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001L //tipos de funciones eventos typedef void __fastcall(__closure* SYSTEMBREAKPOINT)(void); typedef void __fastcall(__closure* BREAKPOINT)(DWORD); typedef void __fastcall(__closure* EXCEPTION)(int,DWORD); typedef void __fastcall(__closure* CREATEPROCESS)(CREATE_PROCESS_DEBUG_INFO *); typedef void __fastcall(__closure* EXITPROCESS)(EXIT_PROCESS_DEBUG_INFO *); typedef void __fastcall(__closure* CREATETHREAD)(CREATE_THREAD_DEBUG_INFO *); typedef void __fastcall(__closure* EXITTHREAD)(EXIT_THREAD_DEBUG_INFO *); typedef void __fastcall(__closure* LOADDLL)(LOAD_DLL_DEBUG_INFO *); typedef void __fastcall(__closure* UNLOADDLL)(UNLOAD_DLL_DEBUG_INFO *); typedef void __fastcall(__closure* OUTPUTSTRING)(OUTPUT_DEBUG_STRING_INFO *); typedef void __fastcall(__closure* RIP)(RIP_INFO *); typedef void __fastcall(__closure* SINGLESTEP)(void); typedef struct{ SYSTEMBREAKPOINT FuncSystemBreakPoint; BREAKPOINT FuncBPs; EXCEPTION FuncException; CREATEPROCESS FuncCreateProcess; EXITPROCESS FuncExitProcess; CREATETHREAD FuncCreateThread; EXITTHREAD FuncExitThread; LOADDLL FuncLoadDLL; UNLOADDLL FuncUnLoadDLL; OUTPUTSTRING FuncOutPutString; RIP FuncRIP; SINGLESTEP FuncSingleStep; }TEventDebugCallBack; class TDebugger { //estructura debug_event requerida para obtener los eventos del proceso y poder gestionarlos public: //variable necesaria para salir cuando lo deseemos del bucle bool Terminated; AnsiString PathFile; bool DebugExists; TDebugger(); ~TDebugger(); bool InitDebug(void); //Carga la víctima void LoopDebug(void); // inicio de la depuración // Solo tienen sentido si el depurador está parado AnsiString ReadString(DWORD, int); bool SetBP(DWORD); bool RemoveBP(DWORD); bool SetHBP(DWORD, int, int, int); bool RemoveHBP(int); bool RemoveAllHBP(void); DWORD GetEAX(void); DWORD GetECX(void); DWORD GetEDX(void); DWORD GetEBX(void); DWORD GetESP(void); DWORD GetEBP(void); DWORD GetESI(void); DWORD GetEDI(void); DWORD GetEIP(void); void SetSingleStep(void); DWORD GetLastAddress(void); void SetEAX(DWORD Valor); void SetECX(DWORD Valor); void SetEDX(DWORD Valor); void SetEBX(DWORD Valor); void SetESP(DWORD Valor); void SetEBP(DWORD Valor); void SetESI(DWORD Valor); void SetEDI(DWORD Valor); void SetEIP(DWORD Valor); // Establecer los CallBacks void SetOnSystemBreakPoint(SYSTEMBREAKPOINT); void SetOnBPs(BREAKPOINT); void SetOnException(EXCEPTION); void SetOnCreateProcess(CREATEPROCESS); void SetOnExitProcess(EXITPROCESS); void SetOnCreateThread(CREATETHREAD); void SetOnExitThread(EXITTHREAD); void SetOnLoadDll(LOADDLL); void SetOnUnLoadDll(UNLOADDLL); void SetOnOutPutString(OUTPUTSTRING); void SetOnRIP(RIP); void SetOnSingleStep(SINGLESTEP); void SetCallBack(TEventDebugCallBack *); //************************************** private: BOOL SearchBPOnList(DWORD, BYTE *, int *, bool *); // Eventos del hilo de depuración DWORD OnCreateThreadDebugEvent(LPDEBUG_EVENT); DWORD OnCreateProcessDebugEvent(LPDEBUG_EVENT); DWORD OnExitThreadDebugEvent(LPDEBUG_EVENT); DWORD OnExitProcessDebugEvent(LPDEBUG_EVENT); DWORD OnLoadDllDebugEvent(LPDEBUG_EVENT); DWORD OnUnloadDllDebugEvent(LPDEBUG_EVENT); DWORD OnOutputDebugStringEvent(LPDEBUG_EVENT); DWORD OnRipEvent(LPDEBUG_EVENT); // tratamiento de excepciones DWORD OnSingleStep(LPDEBUG_EVENT); DWORD OnBreakpointDebugEvent(LPDEBUG_EVENT); DWORD LastExceptionAddress; protected: //Para la gestion de los BPs TList *ListaBPs; //Lista para la gestion de las estructuras BP int pos; //Para recuperar la posicion que ocupa un BP en la lista bool estadoBP; //Lo uso para saber si el usuario quiso eliminar el BP de la lista DWORD FAddrOnBPSS; // Dirección del BP a restaurar en EXCEPTION_SINGLE_STEP BYTE bOriginal; //Lo uso para obtener el byte original de la posición del BP //Estructura para cada BP typedef struct TBP { DWORD dir; BYTE byteOriginal; bool estado; //true activado, false desactivado }*pBP; //Estructura startup requerida para createprocess STARTUPINFO si; //estructura process information requerida para el pid PROCESS_INFORMATION pi; //estructura context contiene los valores de los registros #pragma align 8 // no recuerdo bien si esto se hace con un #pragma CONTEXT con; // Funciones de callback SYSTEMBREAKPOINT FuncSystemBreakPoint; BREAKPOINT FuncBPs; SINGLESTEP FuncSingleStep; EXCEPTION FuncException; CREATEPROCESS FuncCreateProcess; EXITPROCESS FuncExitProcess; CREATETHREAD FuncCreateThread; EXITTHREAD FuncExitThread; LOADDLL FuncLoadDLL; UNLOADDLL FuncUnLoadDLL; OUTPUTSTRING FuncOutPutString; RIP FuncRIP; }; #endif En lo que pongo arriba no me reconocería ni FuncSingleStep, ni FuncSingleStep(), ni OnSingleStep(&DebugEv) pero me pasa igual con todas las demás. He probado cosas como: Synchronize(dwContinueStatus = TDebugger::OnExitProcessDebugEvent(&DebugEv)); pero creo que esto no explota de milagro jajaja. Ya no se que probar. Última edición por aguml fecha: 27-03-2014 a las 15:01:12. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problemas con hilos y remobjects Pascal Script. | J.Slann | Varios | 4 | 19-11-2011 17:35:28 |
Problemas con acceso telefonico a redes e hilos | ospaco69 | OOP | 0 | 08-08-2007 00:02:36 |
problemas con hilos (Thead) | jmlifi | Varios | 2 | 20-03-2007 17:56:53 |
problemas con Hilos (Thread) | jmlifi | Varios | 2 | 26-02-2007 15:29:21 |
Builder c++ 6 y los hilos | javikanin | C++ Builder | 1 | 26-11-2004 14:49:10 |
|