Calcular tiempo estimado de un proceso

frases de busqueda interna: calcular tiempo estimado de un proceso en programación, calcular tiempo estimado de un proceso en delphi, calcular tiempo restante en programación, calcular tiempo restante en delphi, calcular tiempo transcurrido en programación, calcular tiempo transcurrido en delphi, calcular tiempo que falta en programación, calcular tiempo que falta en delphi, obtener tiempo restante de un proceso en delphi, obtener tiempo restante de una rutina en delphi, obtener tiempo restante de una tarea en delphi, calcular tiempo aproximado de un proceso, si alguna vez necesitas calcular e actualizar en tiempo real (mientras se esta realizando el proceso) de una tarea, copiado de archivos, calculos matematicos, descargar de internet,copiado de registros de una base de datos, etc. y quieres mostrar el tiempo estimado e restante de un proceso, es decir el tiempo que aún queda para finalizar la tarea.

Algunos programas cuando se hace una tarea que necesita tiempo de espera, como los programas antivirus, desfragmentados, compresores, descargas y subidas masivas, envío de emails con archivos adjuntos, muestran una barra de progreso y el tiempo que lleva (elapsed time) y el tiempo que aún queda para finalizar (estimated time), a veces el tiempo que se calcula no es muy ajustado depende de los factores del proceso

Calcular el tiempo transcurrido
para calcular el tiempo transcurrido de un proceso cualquiera comentado arriba, primero de todo debemos capturar el tiempo inicial de la tarea y cuando queramos actualizar el contador de tiempo, se obtiene el tiempo actual y con una simple resta tiempo_actual – tiempo_inicial obtendremos el tiempo transcurrido

Calcular el tiempo estimado
Para calcular el tiempo estimado de un proceso etc.., tenemos que desglosar la tarea en partes, y por cada parte calcular el tiempo que ha transcurrido y para obtener el tiempo estimado multiplicamos el tiempo transcurrido por las partes restantes

ejemplo “calcular tiempo estimado de copiado de archivos en disco” en pseudo código

tiempo_inicial = ahora();
archivos = ‘50 archivos de 1024 bytes’
contador = 0
bucle de 1 hasta 50
incrementar(contador)
tiempo_inicial_copiado = ahora()
copiar_archivo_en  nueva ubicacion
tiempo_final_copiado = ahora()
tiempo_restante = (tiempo_final_copiado – tiempo_inicial_copiado) x (50 – contador)
tiempo_transcurrido = tiempo_final_copiado – tiempo_inicial
actualizar contador de tiempo
fin bucle

Para obtener el tiempo restante de una descarga de archivo de internet se debería calcular por bloques de descarga por ejemplo lo que se tarda en descargar 1024 bytes que sería un 1 Kb sabiendo eso y que el archivo pese 1 Megabyte, ya lo tendríamos

Para obtener el tiempo restante de una transacción de base de datos, copia de registros, eliminación, migración etc.. Debemos calcular lo que tarda por un registro o si es muy enorme por bloques de registros

como puedes ver el tiempo transcurrido no es exacto depende de factores del mismo proceso, el siguiente ejemplo hecho en delphi sirve para calcular un tiempo transcurrido que se puede adaptar, la actualización del tiempo lo muestra en horas minutos y segundos

var
 StartTime,EndTime,ElapsedTime,EstimatedTime: Dword;
 actual_progress,total_progress,i:integer;
 Estimated_hours:dword;Estimated_Minutes:dword;Estimated_seconds:dword;
 Informacion:string;
begin
 Timer1.Enabled := false;
 Actual_progress := 0;
 total_progress := 10;
 for i:=Actual_progress to Total_Progress do
 begin
 StartTime := GetTickCount();
 //processo a realizar
 EndTime := GetTickCount();
 ElapsedTime := EndTime-StartTime;
 TranscursTime := ElapsedTime * (total_progress - i);
 //calculo de horas minutos y segundos
 Estimated_hours := (ElapsedTime div (3600 * 999)) mod 24;
 Estimated_Minutes := (ElapsedTime div (60 * 999)) mod 60;
 Estimated_Seconds := (ElapsedTime div 999) mod 60;
 Informacion := 'Tiempo estimado: ' + inttostr(Estimated_hours) + ':' + inttostr(Estimated_Minutes) + ':' + inttostr(Estimated_Seconds);
 label1.Caption := Informacion;
 end;
end;

,

No Comments

Obtener path de los directorios de windows

Con ese truco podemos obtener los directorios de windows usando delphi

La función es FM_GetSpecialDirectory(directorio:string):string;
se debe cargar en uses la librería ShlObj

Parametros del atributo directorio

AppData
CdBurn
AdminTools
Cookies
StartMenu
Desktop
Favorites
Fonts
History
InternetCache
LocalAppData
MyMusic
MyImages
Metwork
MyDocuments
Printers
User
Programs
Shared
Sendto
Starmenu
Starmenuprog
System
Windows
Temp

Código

Uses ShlObj;
Function FM_GetSpecialDirectory(const directorio : string) : string;
var RecPath : PAnsiChar;
 CSIDL:integer;
begin
 if ansilowercase(directorio) = 'appdata' then  CSIDL := $001a;
 if ansilowercase(directorio) = 'cdburn' then  CSIDL := $003b;
 if ansilowercase(directorio) = 'admintools' then  CSIDL := $002f;
 if ansilowercase(directorio) = 'cookies' then  CSIDL := $0021;
 if ansilowercase(directorio) = 'startmenu' then  CSIDL := $0000;
 if ansilowercase(directorio) = 'desktop' then  CSIDL := $0010;
 if ansilowercase(directorio) = 'favorites' then  CSIDL := $0006;
 if ansilowercase(directorio) = 'fonts' then  CSIDL := $0014;
 if ansilowercase(directorio) = 'history' then  CSIDL := $0022;
 if ansilowercase(directorio) = 'internetcache' then  CSIDL := $0020;
 if ansilowercase(directorio) = 'localappdata' then  CSIDL := $001c;
 if ansilowercase(directorio) = 'mymusic' then  CSIDL := $000d;
 if ansilowercase(directorio) = 'myimages' then  CSIDL := $0027;
 if ansilowercase(directorio) = 'network' then  CSIDL := $0013;
 if ansilowercase(directorio) = 'mydocuments' then  CSIDL := $0005;
 if ansilowercase(directorio) = 'printers' then  CSIDL := $001b;
 if ansilowercase(directorio) = 'user' then  CSIDL := $0028;
 if ansilowercase(directorio) = 'programs' then  CSIDL := $0026;
 if ansilowercase(directorio) = 'shared' then  CSIDL := $002b;
 if ansilowercase(directorio) = 'recent' then  CSIDL := $0008;
 if ansilowercase(directorio) = 'sendto' then  CSIDL := $0009;
 if ansilowercase(directorio) = 'starmenu' then  CSIDL := $000b;
 if ansilowercase(directorio) = 'starmenuprog' then  CSIDL := $0007;
 if ansilowercase(directorio) = 'system' then  CSIDL := $0025;
 if ansilowercase(directorio) = 'windows' then  CSIDL := $0024;
 if ansilowercase(directorio) = 'temp' then  CSIDL := $0024;

 RecPath := StrAlloc(MAX_PATH);
 try
 FillChar(RecPath^,MAX_PATH,0);
 if SHGetSpecialFolderPath(0,RecPath,CSIDL,false) then begin
 result := RecPath;
 if ansilowercase(directori) = 'temp' then result := RecPath + '\temp';
 end else result := '';
 finally
 StrDispose(RecPath);
 end;
end;

su uso es muy fácil
FM_GetSpecialDirectory(‘windows’);

con eso obtenemos el directorio donde windows está instalado C:\windows en mi caso

,

No Comments

Realizar una pausa, el delay en delphi

Hacer que el programa espere un tiempo, como la función delay de pascal, tiempo de espera en delphi, realizar una pausa con delphi, retardar ejecutación con delay

En pascal hay la función delay que sirve para esperar un tiempo determinado antes de ejecutar la siguiente instrucción, en delphi carece de la función delay, pero con el siguiente truco conseguimos dicho efecto, podemos programar retardos en milisegundos, recuerda un segundo tiene 1000 milisegundos

procedure SYS_Delay(msecs:integer);
var
 FirstTickCount:longint;
begin
 FirstTickCount:=GetTickCount;
 repeat
 Application.ProcessMessages; {allowing access to other
 controls, etc.}
 until ((GetTickCount-FirstTickCount) >= Longint(msecs));
end;

,

No Comments

Detectar si hay conexión a internet

detectar si hay conexión a internet con delphi, si queremos saber si la computadora tiene conexión a internet podemos usar el siguiente truco, con la función  Net_IsConnected que nos devuelve un booleano si hay conexión o no, usa la librería Wininet

uses wininet;
function Net_IsConnected: boolean;
const
 // local system uses a modem to connect to the Internet.
 INTERNET_CONNECTION_MODEM      = 1;
 // local system uses a local area network to connect to the Internet.
 INTERNET_CONNECTION_LAN        = 2;
 // local system uses a proxy server to connect to the Internet.
 INTERNET_CONNECTION_PROXY      = 4;
 // local system's modem is busy with a non-Internet connection.
 INTERNET_CONNECTION_MODEM_BUSY = 8;

var
 dwConnectionTypes : DWORD;
begin
 dwConnectionTypes := INTERNET_CONNECTION_MODEM +
 INTERNET_CONNECTION_LAN +
 INTERNET_CONNECTION_PROXY;
 Result := InternetGetConnectedState(@dwConnectionTypes,0);
end;

su uso es muy simple

if (Net_IsConnected) Then showmessage('hay conexión a internet');

No Comments

Cuadros de dialogo de windows en Delphi

El sistema operativo Windows nos ofrece diferentes cuadros de dialogo, para mostrar texto, cuadros con opciones, selección de directorios, entradas de texto, salvar documento.

ShowMessage – Mostrar un cuadro de dialogo simple
El primero que veremos es el cuadro de dialogo simple, ese cuadro de dialogo solo permite texto, sirve para informar de un proceso al usuario y solo tiene un botón Acepter, Ok

CuadroDialogo_simple

Para mostrar ese cuadro de dialogo usaremos la función ShowMessage de delphi
Function ShowMessage(‘mensaje’);

Ejemplo:
ShowMessage(‘Hola mundo!!!’);

MessageBox – Mostrar un cuadro de dialogo personalisado
Para crear un cuadro de dialogo con botones para poder escojer una opción y icono usaremos la funcion MessageBox de delphi

function MessageBox(Handler,const Message, Title: PChar; Flags: Longint = MB_OK): Integer;

Handler = identificador de ventana
Message
= Mensaje que queremos mostrarm
Title= Titulo del cuadro de dialogo
Flags: Botones y icono a mostrar

Botones:
Mb_AbortRetryIgnore: Muestra los botones Abortar, Reintentar y Ignorar
Mb_OK: Muestra el boton Aceptar
Mb_OkCancel: Muestra los botones Aceptar y Cancelar
Mb_RetryCancel: Muestra los botones Reintentar y Cancelar
Mb_YesNo: Muestra los botones SI y No
Mb_YesNoCancel: Muestra los botones Si, No y Cancelar

Iconos
Mb_IconWarning: Muestra el icono de Advertencia *Mb_IconExclamation
Mb_IconAsterisk: Muestra el icono de Información *Mb_IconInformation
Mb_IconQuestion: Muestra el icono de Pregunta
Mb_IconError: Muestra el icono de Error

Ejemplo:
MessageBox(form1.Handle,’mensaje’,'tittulo’,mb_YesNo  + mb_IconInformation);

creará un cuadro de dialogo parecido a la imagen
showmessage_ex1

La función MessageBox nos devuelve el boton que el usuario a pulsado, su resultado puede ser:

IdYes
: cuando el botón Si ha sido pulsado
IdRetry: cuando el botón Reintentar ha sido pulsado
IdOk: cuando el botón Aceptar ha sido pulsado
IdNo: cuando el botón No ha sido pulsado
IdIgnore: cuando el botón Ignorar ha sido pulsado
IdCancel: cuando el botón Cancelar ha sido pulsado
IdAbort: cuando el botón Abortar ha sido pulsado

Ejemplo 2 *obtener el resultado de un MessageBox

var
  botonsel : Integer;
begin
  botonsel := MessageBox(form1.Handle,'mensaje','tittulo',mb_yesno  +MB_ICONINFORMATION);
  if (botonsel = idYes) then showmessage('ha pulsado si');
end;

*el cuadro de dialogo con ShowMessage siempre aparece al centro de la aplicación

InputBox – Pedir información al usuario
Para pedir al usuario información a través de un cuadro de dialogo usaremos la función InputBox de delphi

Function InputBox(titulo,label,texto):string;

Titulo= titulo del cuadro de dialogo
label = la información a pedir
texto = texto predeterminado

La función nos devuelve una cadena con lo que ha introducido el usuario

Ejemplo

Var
  cadena: string;
begin
  cadena := inputbox('Entra un texto','texto','...');
end;

SelectDirectory – Para seleccionar un directorio
Con la función de delphi SelectDirectory  llamamos al cuadro de dialogo para seleccionar un directorio.

function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
Ejemplo:

var
  initialDir,ResultDir: string;
begin
  ResultDir := '';
  if ( SelectDirectory('Select directory...',initialDir,resultDir) ) then
    ShowMessage(ResultDir);
end;

mostrará un cuadro como el siguiente:
selectdirectory

Codigo fuente del articulo – delphi 7.0

,

No Comments

Detectar y prevenir el cierre de windows

Muchos programas de windows cuando damos la orden de apagar el sistema o bien reiniciarlo, si hemos hecho cambios sobre algún documento nos dice con un cuadro de dialogo si queremos guardar etc..

En esta entrada explicare como detectar el apagado del sistema operativo windows usando mensajes que nos envía el SO cuando el usuario decide apagar o bien reiniciar

Con WMQueryEndSession podemos detectar el cierre del sistema operativo

Para poder capturar mensajes de windows tenemos que ponerlo en la parte private de la unidad

procedure WMQueryEndSession(var Msg: TMessage); message WM_QUERYENDSESSION;

Ejemplo:

Procedure TForm1.WMQueryEndSession(var Msg : TMessage);
begin
if (MessageDlg('Quieres continuar con el apagado?',mtConfirmation,[mbYes,mbNo],0)) = mrNo then
     Msg.Result := 0
else
     Msg.Result := 1;
     close;
end;

Consejos:
Dependiendo de la aplicación que diseñamos, a la hora de detectar el apagado de windows podríamos hacer varias operaciones, por ejemplo un editor de texto básico.
Si el usuario ha creado un documento nuevo y no lo ha guardado, podríamos guardarlo automáticamente con algún nombre predeterminado, que cuando volviera abrir nuestro programa le advirtiera de que ultima vez no se guardo el documento y si lo quiere respaldar.
Podríamos también mostrar un cuadro de dialogo con algún temporizador que al terminar si el usuario no hace ninguna operación se apagara el sistema.

, ,

No Comments

Detectar el modo de inicio de Windows

A veces nos puede resultar útil detectar si se inició el sistema operativo de forma normal, seguro “safe mode” o bien a modo de prueba de errores con red, para saber eso utilizaremos la función GetSystemMetrics con el atributo SM_CLEANBOOT que nos devolvera el modo de inicio del sistema con tres valores

0 = Inicio Normal
1 = Inicio Seguro
2 = Modo a prueba de errores con red

ejemplo de uso

var inicio:integer;
begin
 inicio := GetSysTemMetrics(SM_CLEANBOOT);

 case inicio of
 1: ShowMessage('Inicio Normal');
 2: ShowMessage('Modo de Prueba');
 3: ShowMessage('Modo a prueba de errores con red');
 else
 ShowMessage('No se ha detectado');
 end;
end;

No Comments

Generar números aleatorios con delphi

la función Random en delphi nos permite generar números aleatorios, podemos generar con coma flotante o bien enteros

usamos random de la siguiente manera

variable := random;

la variable puede ser float o intenger, pero por defecto random nos devuelve un coma flotante

var
 numero:single;
begin
 numero := random;
end;

si queremos que nos devuelva un entero debemos marca-le un limite

random(100) eso nos devolverá un valor de 0 a 100 aleatoriamente

var
 numero:integer
begin
 numero := random(100);
end;

con la función RandomRange podemos especificar un rango de números aleatorios, es decir si quisiéramos obtener un numero aleatorio del 10 a 30

numero := randomRange(10,30);

Función Randomize que es la quien genera los patrones de los números aleatorios, si no la ponemos el random siempre nos devuelve la misma serie de números aleatorios y si la insertamos en un lugar del programa tendremos 100% números aleatorios

y por ultimo RandSeed que es para saber que numero aleatorio irá a continuación

numero := RandSeed;

No Comments

Ventanas parpadeantes con FlashWindow

frase de busqueda interna
Cómo crear una barra de título intermitente en un formulario, ventana intermitente, formulario parpadeante, formulario intermitente, formulario flashing,Window flashing,  efecto brillo formulario, efecto brillo en ventana,ventana parpadeante en la barra de tareas

Una técnica para avisar al usuario mientras tiene una ventana minimizada es hacerla parpadear en la barra de herramientas, un ejemplo claro lo hace el famoso programa de meseguería MSN Messenger, que cuando alguien nos habla y tenemos su ventana minimizada, empieza a parpadear hasta que la abrimos, con delphi es muy simple hacer parpadear una ventana con una sola función lo hacemos todo

FlashWindow(Handle,True);

En Handle le pasamos el Handle de la ventana que queramos hacerla parpadear, la función solo lo hace una vez, si queremos el efecto repetitivo, una solución seria ponerla dentro de un timer como el siguiente ejemplo

Timer1.Interval = n  (Tip for n = 1000  "1 second")

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 FlashWindow(Handle, true);
 FlashWindow(Application.Handle, true);
end;

,

No Comments

Abrir el panel de control con delphi

Mostrar el panel de control de windows con delphi y como ejecutar un applet del panel de control especifico
el panel de control de windows lo podemos llamar con la libreria shell32.dll

ShellExecute(Form1.Handle, nil, ‘rundll32.exe’,  ’shell32.dll,Control_RunDLL’, nil, W_SHOW);

recueda en cargar ShellApi en el uses para utilizar la funcion ShellExecute

si queremos abrir un applet determinado que se encuentra dentro del panel de control de windows

ShellExecute(Form1.Handle, nil, ‘rundll32.exe’,’shell32.dll,Control_RunDLL mmsys.cpl’, nil, SW_SHOW);

mmsys.cpl es el applet Multimedia:

se puede especificar el tab que queremos que se abre, aqui se especifica 1 que seria la segunda solapa de applet multimedia

ShellExecute(Form1.Handle, nil, ‘rundll32.exe’,’shell32.dll,Control_RunDLL mmsys.cpl,,1′, nil, SW_SHOW);

Lista de applets de windows

Podemos hacer una busqueda de archivos con .cpl y obtener sus nombres

AC3 Filter ac3filter.cpl
Adobe Gamma Adobe Gamma.cpl
Adobe Version Cue CS2 VersionCueCS2.cpl
Application paths apppaths.cpl
Autodesk Plotter Manager plotman.cpl
AvantGo Connect agcpl.cpl
Avira AntiVir PersonalEdition avconfig.cpl
BACKPACK Finder bpcpl.cpl
BDE Administrator bdeadmin.cpl
ClearCase cc.cpl
Color Settings 3dcc.cpl
Compaq Diagnostics cpqdiag.cpl
Control Panel controlp.cpl
Creative Element Power Tools
Corel Versions verscpl.cpl
DANS danetsvc.cpl
DiskAccess dacfg.cpl
Folder size FolderSize.cpl
FirebirdSQL Service Manager fmmgr.cpl
HP Jetadmin jetadmin.cpl
HP Lock Hplock.cpl
IconPackager ipcpl.cpl
ImDisk Virtual Disk Driver imdisk.cpl
Intel Extreme Graphics igfxcpl.cpl
IP Office Voicemail Pro ims.cpl
Java jpicpl32.cpl
JInitiator 1.x.y.z plugincpl1xyz.cpl
MSConfig MSConfig.cpl
MultiSite ms.cpl
Nero BurnRights NeroBurnRights.cpl
nVIDIA Control panel nvidia.cpl
Pointer Devices tbctlpnl.cpl
Quicktime quicktime.cpl
RealPlayer prefscpl.cpl
Realtek AC97 Audio Control Panel alsndmgr.cpl
RESTrick Control Panel rest2.cpl
Safarp safarp.cpl
Send To Toys sendtotoys.cpl
Services and Devices pserv.cpl
SNTP Service sntpserv.cpl
Startup startup.cpl
Symantec LiveUpdate s32lucp2.cpl
System Information Sancpl.cpl
System Info for Windows siw.cpl
Trust-No-Exe trustnoexe.cpl
VMware Tools VMControlPanel.cpl
WIBU-KEY wibuke32.cpl
Winlogos wnlgo.cpl
X-Setup Pro xqdcXSPApplet.cpl

,

No Comments