![]() |
![]() |
| 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
|
||||
|
||||
|
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();
}
}
//---------------------------------------------------------------------------
|
|
#2
|
||||
|
||||
|
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;
}
Código:
if(HDebugger->Suspended == true)
HDebugger->Suspend();
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? |
|
#3
|
||||
|
||||
|
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";
}
Saludos. Última edición por escafandra fecha: 24-03-2018 a las 13:09:37. |
|
#4
|
||||
|
||||
|
Eso ya me funciona pero el problema ahora es que si pongo:
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)
{
FreeOnTerminate = true;
Suspended = false;
}
//---------------------------------------------------------------------------
void __fastcall HDebugger::Execute()
{
//---- Place thread code here ----
Synchronize(ActualizarDatos);
//Synchronize((TThreadMethod)&ActualizarDatos);
}
//---------------------------------------------------------------------------
void __fastcall HDebugger::ActualizarDatos(void)
{
int x = 0;
while(x != 1){x = 0}
}
He intentado esto: Código:
//Terminamos el hilo del debugger
if(HiloDebugger != NULL)
{
HiloDebugger->Terminate();
delete HiloDebugger;
}
Código:
//Terminamos el hilo del debugger
if(HiloDebugger != NULL)
{
HiloDebugger->Suspended = true;
HiloDebugger->Terminate();
delete HiloDebugger;
}
Código:
if(HiloDebugger->Suspended == true)
HiloDebugger->Suspend();
|
|
#5
|
||||
|
||||
|
Es que tu hilo no tiene bucle por lo tanto termina solo tras ejecutar la función Execute. Sólo te queda liberarlo (Free) si no pones FreeOnTerminate = true en el constructor, en cuyo caso se libera sólo.
Saludos. |
|
#6
|
||||
|
||||
|
bueno si que tiene bucle lo que pasa es que el codigo es bastante largo y para hacerlo mas sencillo lo puse asi pero dentro de ActualizarDatos hay un do while que es para fuerza bruta y puede ser eterno por lo que es muy importante poder pausarlo y pararlo.
De momento he conseguido hacerlo de una manera algo chapucera ya que he creado una variable global de tipo AnsiString y cuando doy a pausar guardo la cadena en dicha variable global y luego doy a Terminated el valor true y tengo como condicion para salir del bucle que si Terminated == true salga y luego al dar a continuar pues recupero el valor de la variable global y sigo por ahi. La cosa se ha liado bastante pero funciona aunque me gustaria hacerlo de la forma mas correcta ya que de este modo al pausar lo que hago realmente es terminar el hilo y al continuar lo vuelvo a crear. |
|
#7
|
||||
|
||||
|
Esa variable global si es una chapuza. Tu buclq debe tener la condición de terminar si Terminated == ture:
Código:
void __fastcall TMyThread::Execute()
{
while (!Terminated){
//........
}
}
Saludos. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|