Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Demora en array (File of Arreglo) (https://www.clubdelphi.com/foros/showthread.php?t=73285)

harimuya 12-04-2011 22:34:06

Demora en array (File of Arreglo)
 
Estimados Srs.

Tengo un problema al ejecutar estas rutinas, demora mucho al generar el archivo, la informacion se recibe
de un Pic, el cual no demora casi nada, pero al ingresar a la rutina siguiente se toma mucho tiempo para generarlo,
alguien podriaindicarme como hacer para que al generar el archivo no demore tanto.

Gracias desde ya por su ayuda

Saludos.
Código Delphi [-]
Begin
    Destino:=Path+'c:\File.Epa';
    IniGra := 0;
    PosIniX:=IniIdx;
    AssignFile(Henry,Destino);

    Rewrite(Henry);
    DataGraf.Idx:=0;
    DataGraf.Nom:='Carlos';
    Write(Henry,DataGraf);

    {$I-}
    for LetIni:=1 to GetTokenCount(Memo1.Text, Caract) do
    begin
      wData:=GetToken(Memo1.Text, Caract, LetIni);

      if (wData <> CadenaSub) then
      begin
        if Length(wData) > 0 then
          VInt[IniGra] := StrToInt(wData)
      end
      else
      if (wData = CadenaSub) and (IniIdx > 1) then
      begin
        seek(Henry,IniIdx-1);
        DataGraf.Hora := wData;
        Write(Henry,DataGraf);
        IniGra  := 0;
        IniIdx  := IniIdx;
      end;

      if IniGra >= 4 then
      begin
        DataGraf.Nom   := '';
        DataGraf.Idx   := IniIdx;
        DataGraf.Line := VInt;
        DataGraf.Hora := '';
        Write(Henry,DataGraf);
        IniGra  := 0;
        IniIdx  := IniIdx+1;
      end;
      IniGra:=IniGra+1;
    end;
    {$I+}

    if IOResult = 0 then
      CloseFile(Henry)
    else
      ShowMessage('Hubo un Error.');
End;
/////////////////////////////
function GetToken(Cadena, Separador: String; Token: Integer): String;
var
  Posicion: Integer;
begin
  while Token > 1 do
  begin
    Delete(Cadena, 1, Pos(Separador,Cadena)+Length(Separador)-1);
    Dec(Token);
  end;
  Posicion:= Pos(Separador, Cadena);
  if Posicion = 0 then
    Result:= Cadena
  else
    Result:= Copy(Cadena, 1, Posicion-1);
end;
//////////////////////////////////
function GetTokenCount(Cadena, Separador: String): Integer;
var
  Posicion: Integer;
begin
  if Cadena <> '' then
  begin
    Posicion:= Pos(Separador, Cadena);
    Result:= 1;
    while Posicion <> 0 do
    begin
      Inc(Result);
      Delete(Cadena, 1, Posicion+Length(Separador)-1);
      Posicion:= Pos(Separador, Cadena);
    end;
  end
  else
    Result:=0;
end;

oscarac 12-04-2011 22:36:18

por favor usa la guia de estilos... no se entiende muy bien tu codigo

ecfisa 13-04-2011 00:16:12

Hola harimuya.

Te faltó aclarar de que tipo son las siguientes declaraciones:
Código Delphi [-]
// empezamos a suponer tipos...
type
  TArrayDesconocido = array[1..???] of Integer;
  TDataGraf = record
    Idx: Integer; // supongo
    Nom: string[??];
    Hora: string[??];
    Line: TArrayDesconocido;
  end;
// seguimos suponiendo tipos ...
var
  DataGraf: TDataGraf;
  Henry: File of TDataGraf;
  Path,Destino: string;
  IniGra: Integer;
  PosIniX: Integer;
  IniIDx : Integer;
  LetIni: Integer;
  Caract: string;
  wData: string;
  CadenaSub: string;
  VInt: TArrayDesconocido;
A partir de estas suposiciones, que bién pueden ser incorrectas, el código compila.

Pero... también te falto:
.La estructura de los datos que están en el TMemo ya que al poner cualquier texto, recibí error de conversión en la línea:
Código Delphi [-]
VInt[IniGra] := StrToInt(wData);
. La cabecera del procedimiento central (varios nombres que declaré en var, sé que son argumentos).

Para poder verificar el por qúe de la demora, deberías poner el código completo de las funciónes que nos presentas, un ejemplo de lo que puede contener el Memo y una descripción somera de lo que realiza el código.

Un saludo.

harimuya 13-04-2011 15:08:27

Gracias Ecfisa por la respuesta,

disculpa por lo datos que no inclui, es cierto los datos son como indicas

Type
VecInt = Array[0..4] of Integer;

FChannel = record
Idx : Integer;
Line : VecInt;
Nom : String[12];
Hora : String[12];
end;

var
DataGraf : FChannel;
Henry: File of FChannel;
Path,Destino: string;
IniGra: Integer;
PosIniX: Integer;
IniIDx : Integer;
LetIni: Integer;
Caract: string;
wData: string;
CadenaSub: string;

Mi pregunta va mas si estructuralmente esta bien, el programa compila y funciona, pero a la hora de generar el archvo demora mucho, paso a explicarte el funcionamiento,
El programa recibe de un Pic 520 muestras de informacion que es relativamente rapido no demora mas de 10 milisegundos, ahi va a estructura, (Data,1250,1155,1200,5,1000,905,1305,605,......), esto lo pasa a un campo Memo, el cual a partir de ahi, lo guarda en "Destino:=Path+'c:\File.Epa';".
al generar el archivo lo prepara y demora casi 200 Milisegundos, a partir de ahi grafica la muestra recibida el cual demora otro 15 milisegundos que es nada,

La gran pregunta es: se puede generar la informacion sin grabar en disco ?? (Write(Henry,DataGraf);)

A la espera de sus comentarios.
Gracias

Casimiro Notevi 13-04-2011 16:26:07

Por favor, leer nuestra guía de estilo, gracias por tu colaboración.
Son unas simples normas para entendernos mejor y que esto no sea un caos. Por ejemplo, explica tu problema detalladamente, etiqueta tu código, etc.


Casimiro Notevi 13-04-2011 16:28:49

Por cierto, la ruta de destino es siempre alguna unidad de red, ¿verdad?, lo digo porque con este código siempre grabará en el disco c:\

Código Delphi [-]
Destino:=Path+'c:\File.Epa';

xxxxxxxxxc:\File.Epa <-- ???

harimuya 13-04-2011 16:51:50

Disculpa Casimiro tendre presente la guia de estilo.

Si es cierto el destino es una unida del disco duro, pero mi pregunta va mas si estructuralmente esta bien la parte del array que es la parte principal ya que demora mucho,
como comentaba no se si podria hacer la parte del array para que lo genere en memoria sin escribir en el disco duro, asumo que seria mas rapido generarlo en memoria,
si es asi, como se podria hacer ya que nunca lo genere en memoria.

Gracias

ecfisa 13-04-2011 22:16:48

Cita:

Empezado por harimuya (Mensaje 396876)
La gran pregunta es: se puede generar la informacion sin grabar en disco ?? (Write(Henry,DataGraf);)

Hola harimuya.

Lo podrías hacer en memoria utilizando un TClientDataSet.

Revisá este enlace que explica de forma sencilla como hacerlo (mensaje #4).

Un saludo.

harimuya 14-04-2011 16:21:47

Gracias Ecfisa,
estoy probando y me va bien.
Saludos.


La franja horaria es GMT +2. Ahora son las 06:07:53.

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