Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Problemas con un Hilo

Hola, tengo un problema con un hilo que he creado. Paso a explicarme.

Primero cree el proyecto y le puse un boton para que ejecute mi hilo:

Unit1.h:
Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <Clipbrd.hpp>

#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#include "HiloDBG.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DbgCLS"
#pragma resource "*.dfm"

TFormPrincipal *FormPrincipal;
HDebugger *HiloDebugger;

__fastcall TFormPrincipal::TFormPrincipal(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TFormPrincipal::ButtonDesencriptarClick(TObject *Sender)
{
        //Creamos el hilo del debugger
        HiloDebugger = new HDebugger(false);
}
//---------------------------------------------------------------------------
Luego en el HiloDBG.cpp tengo esto:

Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "HiloDBG.h"
#include "Unit1.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall HDebugger::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__fastcall HDebugger::HDebugger(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------

void __fastcall HDebugger::Execute()
{
        //---- Place thread code here ----
        Synchronize(ActualizarDatos);
        //Synchronize((TThreadMethod)&ActualizarDatos);
}
//---------------------------------------------------------------------------

void __fastcall HDebugger::ActualizarDatos(void)
{
        FormPrincipal->Caption = "Actualizado desde el hilo";
}
y el HiloDBG.h:

Código:
#ifndef HiloDBGH
#define HiloDBGH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class HDebugger : public TThread
{            
private:
protected:
        void __fastcall ActualizarDatos(void);
        void __fastcall Execute();
public:
        __fastcall HDebugger(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
El problema es que al intentar ejecutarse la linea que cambia el Caption del form pues da la siguiente excepcion:



¿Alguna idea de que puede estar pasando?
Responder Con Cita
  #2  
Antiguo 07-03-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Incluye HiloDBG en el proyecto, no en el código, es decir: elimina esta línea:
Código:
#include "HiloDBG.cpp"
Hecho esto compila y ejecuta perfectamente.


Saludos.
Responder Con Cita
  #3  
Antiguo 07-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Amigo si hago eso me salen estos errores:
[C++ Error] Unit1.cpp(16): E2141 Declaration syntax error
[C++ Error] Unit1.cpp(69): E2451 Undefined symbol 'HiloDebugger'

en esta linea:
HDebugger *HiloDebugger;

y mas errores en cualquier parte del codigo donde haga referencia a HiloDebugger.
Responder Con Cita
  #4  
Antiguo 07-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
vale, solucionado, tenias razon pero me faltó poner el #include "HiloDBG.h", solo eso.
Ahora me encuentro con otros problemas.
En el hilo tengo un bucle que puede ser muy largo por lo que he creado dos botones, uno para pausar o continuar y otro para abortar y que termine el hilo.
Hice esto:

Código:
void __fastcall TFormPrincipal::ButtonAbortarClick(TObject *Sender)
{
        //Terminamos el hilo del debugger
        if(HiloDebugger != NULL)
        {
                HiloDebugger->Terminate();
                delete HiloDebugger;
        }

        //Habilitamos el boton para crear el hilo y deshabilitamos el de terminar el hilo
        ButtonDesencriptar->Enabled = true;
        ButtonEncriptar->Enabled = true;
        ButtonAbortar->Enabled = false;
        ButtonPausar->Enabled = false;
        EditDesencriptado->Enabled = true;
        EditEncriptado->Enabled = true;
        CheckBoxConfirmar->Enabled = true;
        ComboBoxRango->Enabled = true;
        FormPrincipal->RadioGroupOrigen->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TFormPrincipal::ButtonPausarClick(TObject *Sender)
{
        if(ButtonPausar->Caption == "Pausar")
        {
                //Aqui entra cuando pulsamos en Pausar y pausamos el hilo
                ButtonPausar->Caption = "Continuar";
                if(HiloDebugger != NULL)
                        HiloDebugger->Suspend();
        }
        else
        {
                //Aqui entra cuando pulsamos en Continuar y hacemos que el hilo siga
                ButtonPausar->Caption = "Continuar";
                if(HiloDebugger != NULL)
                        HiloDebugger->Resume();
        }
}
//---------------------------------------------------------------------------
¿Que hago mal?
Responder Con Cita
  #5  
Antiguo 07-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Creo que tengo que hacer algo asi:

Código:
void __fastcall TFormPrincipal::FormClose(TObject *Sender, TCloseAction &Action)
{
        //Aqui entramos al cerrar la aplicacion y, si el hilo está, lo terminamos
        //para poder salir sin problemas
        if(HiloDebugger != NULL)
        {
                HiloDebugger->Suspended = true;
                HiloDebugger->Terminate();
                delete HiloDebugger;
        }
}
//---------------------------------------------------------------------------

void __fastcall TFormPrincipal::ButtonAbortarClick(TObject *Sender)
{
        //Terminamos el hilo del debugger
        if(HiloDebugger != NULL)
        {
                HiloDebugger->Suspended = true;
                HiloDebugger->Terminate();
                delete HiloDebugger;
        }

        //Habilitamos el boton para crear el hilo y deshabilitamos el de terminar el hilo
        ButtonDesencriptar->Enabled = true;
        ButtonEncriptar->Enabled = true;
        ButtonAbortar->Enabled = false;
        ButtonPausar->Enabled = false;
        EditDesencriptado->Enabled = true;
        EditEncriptado->Enabled = true;
        CheckBoxConfirmar->Enabled = true;
        ComboBoxRango->Enabled = true;
        FormPrincipal->RadioGroupOrigen->Enabled = true;
}
Y dentro del bucle que está en una funcion que es ejecutada por ActualizarDatos y que no es miembro de la clase HDebugger tengo esto:
Código:
if(HDebugger->Suspended == true)
                        HDebugger->Suspend();
Pero esto ultimo no se lo traga ¿como hago referencia a esa variable dentro de esta funcion?
En Unit1.cpp puedo hacer HiloDebugger->Suspended sin problemas porque creo el hilo con "new" pero en HiloDBG.cpp no puedo y necesito acceder a esa propiedad desde la funcion externa. ¿tengo que crear mi funcion como miembro de la clase para acceder?
Responder Con Cita
  #6  
Antiguo 07-03-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cambia
#include "HiloDBG.cpp" por #include "HiloDBG.h"

Añade el archivo HiloDBG.cpp desde Peoyect -> Add to proyect -> HiloDBG.cpp

Código:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "HiloDBG.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormPrincipal *FormPrincipal;
HDebugger *HiloDebugger;
//---------------------------------------------------------------------------
__fastcall TFormPrincipal::TFormPrincipal(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TFormPrincipal::Button1Click(TObject *Sender)
{
   HiloDebugger = new HDebugger(false);
}
Código:
#include <vcl.h>
#pragma hdrstop

#include "HiloDBG.h"
#include "Unit1.h"
#pragma package(smart_init)

__fastcall HDebugger::HDebugger(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}

void __fastcall HDebugger::Execute()
{
  Synchronize(ActualizarDatos);
}

void __fastcall HDebugger::ActualizarDatos(void)
{
   FormPrincipal->Caption = "Actualizado desde el hilo";
}
Subo el proyecto.

Saludos.

Última edición por escafandra fecha: 24-03-2018 a las 13:09:37.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
cuando llamo ejecutar un hilo dentro del proceso del hilo no lo hace robertosc Varios 1 14-08-2007 22:11:09


La franja horaria es GMT +2. Ahora son las 13:29:30.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi