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 19-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 19-06-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Tienes hilos o codigo async en algun lado?
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 19-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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

Última edición por aguml fecha: 19-06-2020 a las 17:59:10.
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
Retraso al leer datos de una bascula trex2000 Varios 4 29-08-2011 01:33:12
progressbar 11_8_88 C++ Builder 2 04-11-2008 19:46:33
ProgressBar chinchan C++ Builder 6 16-10-2008 15:15:00
Progressbar Paulao Varios 6 28-05-2008 20:49:41
Progressbar mminorm Varios 1 29-05-2005 07:19:21


La franja horaria es GMT +2. Ahora son las 09:26:27.


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