Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 16
danielmj Va por buen camino
Hola ecfisa, saludos

mira..

Declaración del hilo...
Código Delphi [-]
...
private
{ Private declarations }
Thread: TStopStartThread;
WaitThread: TWaitThread;
UntilFlag: TEvent;
...

hago la llamada al hilo...
Código Delphi [-]
Procedure TPrincipal.Button1Click(Sender: TObject);
begin
  Thread.MsgWaitFor(CortarArchivo(labEdit1.Text,2048), nil); //---> Aquí me da el error o uno de los que posiblemente me vaya a dar.
  //CortarArchivo(labEdit1.Text,2048); --> esta linea esta operativa en este momento ya que el hilo  lo tengo "anulado" por no correr.
end;

Procedimiento "CortarArchivo"...
Código Delphi [-]
procedure CortarArchivo(sArchivo: TFileName; iLongitudTrozo: Long64 );
var
  i: Word;
  FS, Stream: TFileStream;
  nombreFile: String;

  label iniciar;

begin
  try
    principal.memo1.Lines.Add(CalcHash(principal.labedit1.Text,haSHA1));
    principal.Memo1.Lines.SaveToFile(principal.labEdit2.Text+ '\'+ extractFileName(principal.LabEdit1.Text+'.crc'));
  except
    on EFCreateError do
      begin
        showMessage ('Unidad seleccionada no válida. Selecciona una unidad' +
        chr(13)+'de disco duro local que sea accesible.');
        principal.Memo1.Text:= '';
        exit;
      end;
  end;

    if principal.opc1.Checked then
    begin
      iLongitudTrozo:= 1048576;        //1MB  --> los tamaños se muestran en Mbytes
      //sArchivo:= principal.LabEdit2.Text;

      FS := TFileStream.Create(sArchivo, fmOpenRead or fmShareDenyWrite);
    try
      principal.Memo2.Lines.Add((Chr(13))+(Chr(10)));
      principal.Memo2.Lines.Add('LISTADO DE ARCHIVOS [ORIGINAL CORTADO]');
      principal.Memo2.Lines.Add((Chr(13))+(Chr(10))+'·································');

      for i := 1 to Trunc( FS.Size / iLongitudTrozo ) + 1 do
      begin
        principal.prBar.Max:= FS.Size div iLongitudTrozo;
        principal.prBar.Position:= i;
        principal.prBar.Refresh;

        nombreFile:= extractFileName(sArchivo);
        try
          sArchivoPartido := ChangeFileExt(principal.labEdit2.Text +'\'+
          nombreFile, '.' + FormatFloat('000', i ) );
          Stream := TFileStream.Create(sArchivoPartido, fmCreate or fmShareExclusive);
        except
        on EFileStreamError do
        ShowMessage ('Unidad seleccionada no valida. Selecciona una unidad de disco duro local.');

        end;
          principal.labEdit2.SelStart:= 0;
          principal.labEdit2.SelLength:= length(principal.labEdit2.Text);
        if (principal.labEdit2.SelLength) = 3 then
            principal.Memo2.Lines.Append(principal.labEdit2.Text + extractFileName(sArchivoPartido))
        else
          principal.Memo2.Lines.Append(principal.labEdit2.Text+'\'+extractFileName(sArchivoPartido));

      try
        if fs.Size - fs.Position < iLongitudTrozo then
          iLongitudTrozo := FS.Size - FS.Position;
          Stream.CopyFrom( FS, iLongitudTrozo );
      finally
        Stream.Free;
      end;
  end;
  finally
  FS.Free;
  principal.Button1.Enabled:= false;

  principal.Memo2.Lines.Add((Chr(13))+ (chr(10)));
  principal.Memo2.Lines.Add('Archivo original: '+principal.LabEdit1.Text);
  principal.memo2.Lines.Add('Ruta destino: '+principal.labEdit2.Text);
  principal.Memo2.Lines.Add('Código HASH: '+principal.Memo1.Text);

  end;
    if principal.prBar.Max = principal.prBar.Position then
    principal.Timer1.Enabled:= true;
    Principal.lblTerminado.Visible:= true;
end;
...
    if principal.opc1.Checked then
    begin
      iLongitudTrozo:= 16106127360;        //15GB
      FS := TFileStream.Create( sArchivo, fmOpenRead or fmShareDenyWrite);
    try
      Principal.Label6.Caption:= IntToStr((FS.Size div iLongitudTrozo) +1);
      principal.Label6.Refresh;

      principal.Memo2.Lines.Add((Chr(13))+(Chr(10)));
      principal.Memo2.Lines.Add('LISTADO DE ARCHIVOS [ORIGINAL CORTADO');
      principal.Memo2.Lines.Add((Chr(13))+(Chr(10))+'·································');

      for i := 1 to Trunc( FS.Size / iLongitudTrozo ) + 1 do
      begin

        principal.prBar.Max:= Round((FS.Size / iLongitudTrozo));
        principal.prBar.Position:= i;
        principal.prBar.Refresh;

        sArchivoPartido := ChangeFileExt(principal.labEdit2.Text +'\'+
        nombreFile, '.' + FormatFloat('000', i ) );
        Stream := TFileStream.Create(sArchivoPartido, fmCreate or fmShareExclusive);

        principal.labEdit2.SelStart:= 0;
        principal.labEdit2.SelLength:= length(principal.labEdit2.Text);
        if (principal.labEdit2.SelLength) = 3 then
            principal.Memo2.Lines.Append(principal.labEdit2.Text + extractFileName(sArchivoPartido))
        else
          principal.Memo2.Lines.Append(principal.labEdit2.Text+'\'+extractFileName(sArchivoPartido));
      try
        if fs.Size - fs.Position < iLongitudTrozo then
          iLongitudTrozo := FS.Size - FS.Position;
          Stream.CopyFrom( FS, iLongitudTrozo);
      finally
        Stream.Free;
      end;
  end;
  finally
  FS.Free;
  principal.Button1.Enabled:= false;

  principal.Memo2.Lines.Add((Chr(13))+ (chr(10)));
  principal.Memo2.Lines.Add('Archivo original: '+principal.LabEdit1.Text);
  principal.memo2.Lines.Add('Ruta destino: '+principal.labEdit2.Text);
  principal.Memo2.Lines.Add('Código HASH: '+principal.Memo1.Text);
  end;
    if principal.prBar.Max = principal.prBar.Position then
    principal.Timer1.Enabled:= true;
    Principal.lblTerminado.Visible:= true;
  end;
end;

Así está ahora mismo, ¿alguna sugerencia?
Una cosa, no seais muy duros con el código que estoy verdecillo ya sé que habra mil formas de hacerlo mas claro y limpio pero todo a su tiempo. De momento funciona que no es poco jajaj.

P.D.: El ejemplo que uso de hilo es de la web "crea tu software" y no sé si será valido en mi caso.

Saludos y gracias.

Última edición por danielmj fecha: 20-10-2013 a las 23:25:31. Razón: error al copiar
Responder Con Cita
  #2  
Antiguo 21-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 16
danielmj Va por buen camino
Buenas,

Ya lo tengo solucionado, el error era mi despiste y no estudiar bien las explicaciones, a ver el problema estaba (o eso entiendo) que para pasar parametros a un hilo, hay que declarar un type tal que este:

Código Delphi [-]
type
  TData = record
  Codigo: integer;
  Nombre: string;
end;

Obviamente, cambiando nombres, y esto yo no lo hacía. Por otra parte, tampoco declaraba en el uses la unidad "ActiveX", y esta es necesaria para incializar el hilo con el parametro "CoInitialize"

Código Delphi [-]
procedure TJoin.ThreadExample(Data: pointer);
begin
  CoInitialize(nil);
  UnirArchivo(labEdit1.Text,labEdit2.Text);
end;

Bueno, esa es la solución. Espero que le sirva a alguien.
Saludos.

Última edición por danielmj fecha: 21-10-2013 a las 11:58:42. Razón: error al escribir
Responder Con Cita
  #3  
Antiguo 21-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola danielmj.

Gracias por presentarnos la solución

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 21-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 16
danielmj Va por buen camino
bueno, bien o mal explicado, creo que puede ayudar a alguien o eso espero. En cuanto al hilo, ya está corriendo

saludos.
Responder Con Cita
  #5  
Antiguo 22-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 16
danielmj Va por buen camino
Hola nuevamente,
Parece que no es oro todo lo que reluce... y digo esto por que si bien el hilo ya corre, cuando pulso el botón para salir (o matar al hilo), no hace ni caso y el proceso sigue...

Este es código que tengo puesto para cortar el hilo definitivamente y salir de la aplicacion:
Código Delphi [-]
if Assigned(WaitThread) then WaitThread.AbortThread;
    if Thread.Waiting then Thread.AbortThread;
    begin  
      thread.Terminate;
      WaitThread.Terminate;
      FreeAndNil(thread);
      Thread.Free;
      UntilFlag.Free;
   end;
close

¿que hago mal?

Saludos y gracias.

Última edición por danielmj fecha: 22-10-2013 a las 23:27:16. Razón: error al escribir código
Responder Con Cita
  #6  
Antiguo 23-10-2013
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.676
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
No sé que otras cosas harás mal, pero esto sí que está mal:
Código Delphi [-]
FreeAndNil(thread);
thread.Free;

Con FreeAndNil liberas la memoria ocupada y la pones a nulo. Luego con Free ... ya no hay nada que liberar, en teoría.
Responder Con Cita
  #7  
Antiguo 23-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 16
danielmj Va por buen camino
Gracias por el apunte casimiro, soy de los que piensa que hay que ser humilde en todos los aspectos de la vida de ahí que sepa reconocer mis errores. Es por eso que os pido consejo sobre tal o cual código, afortunadamente son pocas las otras cosas que hago mal, y aunque la programacion no me vaya a dar de comer (es mas una aficion) el trabajar de 7 de la mañana a 8 de la tarde en un torno paralelo o en la centina de un remolcador, si se me da bien desde hace ya 25 años.
una vez mas gracias por tu comentario lo estudiare y lo pondre en practica a ver que tal.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Pasar cadena de conexion a tadoconnections dentro de un hilo de ejecucion richy08 OOP 4 02-08-2010 23:49:32
como crear un hilo de ejecucion ayudenme plis!!! jazmin OOP 4 21-06-2010 09:55:13
cuando llamo ejecutar un hilo dentro del proceso del hilo no lo hace robertosc Varios 1 14-08-2007 22:11:09
Dudas Crear Objetos en Tiempo de Ejecución Deiv OOP 9 09-08-2007 01:13:15
Parar un hilo de ejecución deivi Varios 6 21-11-2006 13:36:49


La franja horaria es GMT +2. Ahora son las 03:22:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi