 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 24 Nov, 2023 10:03 pm Asunto: Saber cuando un thread a finalizado su ejecucion |
|
|
Quisiera saber si es posible saber cuándo termina de ejecutarse un hilo para continuar con el Código de la función principal.
Este es mi hilo
| Código: |
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <Inifiles.hpp>
#include "TFileMedia.h"
#include "Principal.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:
//
//---------------------------------------------------------------------------
TStringList* Lectura;
TStringList* Campos;
TStringList* Compara;
__fastcall TAlbums::TAlbums(bool CreateSuspended)
: TThread(CreateSuspended)
{
Compara = new TStringList;
Campos = new TStringList;
}
//-------------------------
void __fastcall TAlbums::Listar(String dir, TStrings* sl,int filtro)
{
TSearchRec sr;
AnsiString inicio,fin;
int p=0;
String cad[9] = {".mp3",".wma",".m4a",".mpg",".mp4",".wmv",".avi",".divx",".mkv"};
bool finalizado = FindFirst(dir + "\\*.*", faAnyFile, sr);
while (!finalizado){
if(sr.Name != "." && sr.Name != ".."){
if (sr.Attr & faDirectory ){
Listar(dir + "\\" + sr.Name, sl,filtro);
}
if (sr.Attr & faArchive){
for(int m = 0;m < 9;m ++){
UnicodeString fileExtencion = sr.Name.SubString(sr.Name.LastDelimiter("."),sr.Name.Length()).LowerCase();
if(fileExtencion == cad[m]){
if(filtro != -1){
sl->Add(sr.Name.Trim());
}
else {
sl->Add(dir.Trim());
}
}
}
}
}
finalizado = FindNext(sr);
}
FindClose(sr);
}
//---------------------------------------------------------------------------
/*void __fastcall TAlbums::UpdateCaption()
{
Form1->Caption = validar;
}*/
//---------------------------------------------------------------------------
void __fastcall TAlbums::Execute()
{
FreeOnTerminate = true;
String portable = ExtractFilePath(Application->ExeName);
//---- Place thread code here ----
try{
Compara->Clear();
Campos->Clear();
Listar(Form1->carpeta, Campos,Form1->filtro);
Compara->Sorted = true; // Required for Duplicates to work
Compara->Duplicates = Classes::dupIgnore;
Compara->AddStrings(Campos);
Campos->Assign(Compara);
Campos->Sorted = false;
Campos->Insert(0,"RockProy");
Campos->SaveToFile(portable + ExtractFileName(Form1->carpeta)+".txt");
Form1->MLista->Lines->Assign(Campos);
}
__finally{
delete Campos;
delete Compara;
}
}
//---------------------------------------------------------------------------
|
Así lo llamo, pero no se cuando finaliza
| Código: |
TAlbums *CrearLista = new TAlbums(true);
CrearLista->Priority = tpHigher;
CrearLista->Start(); |
_________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Sab 25 Nov, 2023 5:37 pm Asunto: |
|
|
Puedes hacerlo de manera asíncrona usando el evento OnTerminate de TThread.
| Código: | // Creamos la función a la que se llamará, por ejemplo:
void __fastcall TForm1::Finalizado(TObject* Sender)
{
ShowMessage("Tarea finalizada");
}
//...
TAlbums *CrearLista = new TAlbums(true);
CrearLista->Priority = tpHigher;
CrearLista->OnTerminate = Finalizado;
CrearLista->Start();
|
Y si quieres hacerlo de manera síncrona (usando WaitFor), aunque con el inconveniente de que hasta que no termine la tarea bloqueara la ejecución:
| Código: | //¡Importante! quita el "FreeOnTerminate=true" de Thread para que no se destruya automáticamente al finalizar y de un error
TAlbums *CrearLista = new TAlbums(true);
CrearLista->Priority = tpHigher;
CrearLista->Start();
CrearLista->WaitFor();
delete CrearLista;
ShowMessage("Tarea finalizada");
|
|
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Dom 26 Nov, 2023 2:51 am Asunto: |
|
|
Muchas Gracias Leo muy amable como siempre...
un saludo tenía mucho que no venía por aquí (no encontraba el foro ) espero que estés bien _________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| 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.
|