 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
CHE Invitado
|
Publicado: Jue 10 Oct, 2002 7:11 pm Asunto: abortar un proceso de un componente desde otro componente |
|
|
Hola,
Mi duda es la siguiente:
Tengo un button1.
Si hago un click sobre el se ejecutan las instrucciones que
estan en:
button1click. {
.....
.....
}
¿ Puedo parar este proceso ? o sea,...
¿ Puedo parar el codigo que se ejecuta en el evento button1click desde fuera de él, por ejemplo, desde otro button ?
Gracias. Muchas gracias por la atención. |
|
| Volver arriba |
|
 |
WinMan Invitado
|
Publicado: Jue 10 Oct, 2002 8:08 pm Asunto: |
|
|
Si puedes si el codigo que detiene la ejecución se encuentra en otro thread (hilo de ejecución), revisa el uso de la clase TTHread.
Ten en cuenta que normalmente en una aplicación solo existe 1 hilo de ejecución, lo que evita que se ejecute mas de una línea de ejecución.
Por ejemplo, pon el siguiente evento OnClick:
| Código: |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(double i=0; i<10000000000; i++){
;
}
} |
Si haces click al boton de este evento, veras que no le puedes hacer nada a la forma que contiene dicho boton, esto es por que lo unico que se esta ejecutando es el codigo del for.
Para lograr lo que tu quieres, tienes que manejar diferentes hilos de ejecución dentro de tu programa, el que tiene la ejecución que se lanza cuando oprimes el boton y la ejecución que controla cuando se terminara dicha ejecución.
Aqui tienes un ejemplo:
- Inicia una nueva aplicación
- Agrega 2 botones (TButton)
- Agrega 1 etiqueta (TLabel)
Archivos:
Unit1.cpp
| Código: |
//---------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
bt = new BotonThread;
}
//---------------------------
void __fastcall TForm1::ActLabel(void)
{
static double dbl = 0;
dbl++;
Label1->Caption = AnsiString("dbl esta a: ") + dbl;
}
//---------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
bt->Terminate();
Button1->Enabled = true;
}
//---------------------------
|
Uni1.h
| Código: |
//---------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------
#include "Unit2.h"
//---------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
TLabel *Label1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
BotonThread *bt;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall ActLabel(void);
};
//---------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------
#endif
|
Uni2.cpp
| Código: |
//---------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
//---------------------------
__fastcall BotonThread::BotonThread()
: TThread(true)
{
FreeOnTerminate = true;
Suspended = false;
}
//---------------------------
void __fastcall BotonThread::Execute()
{
while(!Terminated){
Synchronize(Form1->ActLabel);
}
}
//---------------------------
|
Unit2.h
| Código: |
//---------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------
#include <Classes.hpp>
//---------------------------
class BotonThread : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall BotonThread();
};
//---------------------------
#endif
|
Bueno, como vez el manejo de Thread al parecer es sencillo, solo hay que tener mucho cuidado con recursos compartidos y algunas otras cosas, te recomiendo que te busques documnetación sobre esto para que sepas que es lo que haces.
Suerte
WinMan |
|
| Volver arriba |
|
 |
TOÑO Master

Registrado: 26 Ago 2002Mensajes: 223Ubicación: Madrid - España -
|
Publicado: Vie 11 Oct, 2002 12:34 pm Asunto: |
|
|
HOLA:
Por supuesto trabajar con los hilos es mejor. Sin embargo es un poco mas largo que el siguiente codigo, que para lo que quiere el CHE le puede valer.
Utilizar un variable global o miembro de tu clase, como quieras.
bool PARAR;
button1click. {
PARAR = false
while (1)
{
Application ->ProcessMessage();// mientras se ejecuta el codigo, la aplicacion sigue procesando los mensajes.
if (PARAR == true)
break;
.........................
........................
}
}
Buttom2Click()
{
PARA = true;
}
By. |
|
| Volver arriba |
|
 |
WinMan Invitado
|
Publicado: Vie 11 Oct, 2002 11:00 pm Asunto: |
|
|
En definitiva concuerdo con toño. si no existe una necesidad de incluir procesos multihilos, ni liarse con ellos, en ese caso la recomendaciónd de toño es la mejor.
Suerte.
WinMan |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|