Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   ProgressBar reacciona con retraso (https://www.clubdelphi.com/foros/showthread.php?t=94744)

aguml 19-06-2020 13:47:12

ProgressBar reacciona con retraso
 
Hola amigos, me hice una aplicación la cual busca texto en una lista de archivos indicada y me encuentro con que la barra de progreso va mas lenta de lo que debiese aun con el DoubleBuffered activado, o sea, me muestra el mensaje de que la aplicación ha terminado y la barra no ha llegado a su fin y veo como llega tarde. Hablo de un retraso de un par de segundos o más. ¿como puedo solucionar eso? Mi código de esa función está así:

Código PHP:

void __fastcall TForm1::ButtonSearchClick(TObject *Sender)
{
    
int sizeOriginalsizeReemplazo;
    
char *binOriginal=NULL, *binReemplazo=NULL;
    
bool foundederror=false;
    
int nCoincidencias=0;

    
//Inicializo la barra de progreso
    
ProgressBar1->Max=ListBoxSeleccionados->Items->Count;
    
ProgressBar1->Position 0;

    
ListBoxCoincidencias->Items->Clear();
    
//Si no hay archivos en el Listbox no sigo adelante
    
if(ListBoxSeleccionados->Items->Count 0){
        
//Si no hay cadena a buscar no sigo adelante
        
if(EditTextOriginal->Text.Length() > 0){
            
//Me aseguro de que hay algo mas que comodines en el patrón de busqueda
            
if(CheckBoxComodin->Checked){
                
int contador 0;
                for(
int i=1<= EditTextOriginal->Text.Length(); i++){
                    if(
EditTextOriginal->Text[i] == '?'){
                        
contador++;
                    }
                }

                if(
contador == EditTextOriginal->Text.Length()){
                    
MessageBox(NULLL"No se admite como patrón de búsqueda sólo comodines."L"Atención"MB_OK MB_ICONEXCLAMATION);
                    
error true;
                }
            }
        }else{
                
MessageBox(NULLL"Introduce la cadena que deseas buscar y vuelve a intentarlo."L"Atención"MB_OK MB_ICONEXCLAMATION);
                
error true;
        }
    }else{
        
MessageBox(NULLL"No hay archivos donde buscar. Añada primero los archivos en los que desee buscar."L"Atención"MB_OK MB_ICONEXCLAMATION);
        
error true;
    }

    if(!
error){
        for(
int i=0ListBoxSeleccionados->Items->Counti++)
        {
            switch(
RadioGroupTipo->ItemIndex)
            {
                case 
0//ASCII
                    
founded ExecuteMode(ListBoxSeleccionados->Items->Strings[i], AnsiString(EditTextOriginal->Text).c_str(), EditTextOriginal->Text.Length(), AnsiString(EditTextReemplazo->Text).c_str(), EditTextReemplazo->Text.Length());
                    break;

                case 
1//UTF-8
                    
sizeOriginal WideCharToMultiByte(CP_UTF80EditTextOriginal->Text.c_str(), EditTextOriginal->Text.Length(), NULL0NULLNULL);
                    
binOriginal = new char[sizeOriginal];
                    
WideCharToMultiByte(CP_UTF80EditTextOriginal->Text.c_str(), -1binOriginalsizeOriginalNULLNULL);

                    
sizeReemplazo WideCharToMultiByte(CP_UTF80EditTextReemplazo->Text.c_str(), EditTextReemplazo->Text.Length(), NULL0NULLNULL);
                    
binReemplazo = new char[sizeReemplazo];
                    
WideCharToMultiByte(CP_UTF80EditTextReemplazo->Text.c_str(), -1binReemplazosizeReemplazoNULLNULL);

                    
founded ExecuteMode(ListBoxSeleccionados->Items->Strings[i], binOriginalsizeOriginalbinReemplazosizeReemplazo);
                    break;

                case 
2//BINARIO
                    
if(IsFormatCorrectForBinary(EditTextOriginal->Text,CheckBoxComodin->Checked)){
                        if(
IsFormatCorrectForBinary(EditTextReemplazo->Text,false)){
                            
sizeOriginal EditTextOriginal->Text.Length() / 2;
                            
sizeReemplazo EditTextReemplazo->Text.Length() / 2;
                            
binOriginal = new char[sizeOriginal];
                            
binReemplazo = new char[sizeReemplazo];
                            
WideStringToBin(EditTextOriginal->TextbinOriginal);
                            
WideStringToBin(EditTextReemplazo->TextbinReemplazo);

                            
founded ExecuteMode(ListBoxSeleccionados->Items->Strings[i],  binOriginalsizeOriginalbinReemplazosizeReemplazo);
                        }else{
                            
MessageBox(NULLL"El formato del patrón de reemplazo es incorrecto."L"Error"MB_OK MB_ICONERROR);
                            return;
                        }
                    }else{
                        
MessageBox(NULLL"El formato del patrón de busqueda es incorrecto."L"Error"MB_OK MB_ICONERROR);
                        return;
                    }
                    break;
            }

            if(
founded){
                
ListBoxCoincidencias->Items->Add(ListBoxSeleccionados->Items->Strings[i]);
                
nCoincidencias++;
            }
            (
ProgressBar1->Position)++;
            
Application->ProcessMessages();
        }
    }
    
LabelNCoincidencias->Caption nCoincidencias;
    
SetScrollWidth(ListBoxCoincidencias);

    if(
binOriginal != NULL)
        
delete binOriginal;
    if(
binReemplazo != NULL)
        
delete binReemplazo;

    if(!
error)
        
MessageBox(NULL,L"Operación finalizada."L"Atención"MB_OK MB_ICONINFORMATION);


Llega al MessageBox del final y la barra de progreso aun sigue rellenandose :confused:

mamcx 19-06-2020 16:15:42

Tienes hilos o codigo async en algun lado?

aguml 19-06-2020 17:54:08

No, yo no he creado ningún hilo, es un bucle foro en el que se va leyendo los archivos seleccionados y en el bucle voy incrementando la posición de la progressbar y a la salida del bucle está el mensaje. El caso es que sale del bucle y muestra el mensaje y la progressbar aún se va rellenando y llega tarde.
Por si quieres mirar el fuente por si ves algo raro: https://mega.nz/file/EhljVJKB#Rk_zon...Z_5qFtXJHCwUag


La franja horaria es GMT +2. Ahora son las 19:38:24.

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