Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Applicare più processi contemporaneamente
Forum - Delphi - Applicare più processi contemporaneamente - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:37
Martedì, 20/04/2010
Senti ,io non ho capito cosa tu voglia fare con il multithreading.
Comunque se vuoi un copia file eccotelo (anche se so che sei capace di farne uno)

Ultima modifica effettuata da il 21/04/2010 alle 18:26
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:40
Martedì, 20/04/2010
Scusa ,ecco il codice:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ComCtrls,windows;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1 : TButton;
    Button2 : TButton;
    Label1 : TLabel;
    Label2 : TLabel;
    OpenDialog1 : TOpenDialog;
    ProgressBar1 : TProgressBar;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

var
filesorg,
filedest : file;
recordletti : integer;
buffer : array[1..1000] of byte;
nome1,
nome2 : string;


//mi scuso se non applico bene le regole di modularita'
//ma e' solo un esempio
procedure copia;
begin
Assign(filesorg,nome1);
{$I-}
reset(filesorg,1);
{$I+}
if ioresult <> 0 then
   showmessage('Errore');
   // o se no :  messagebox(form1.handle,'Errore!','',MB_ICONERROR);
Assign(filedest,nome2);
rewrite(filedest,1);
blockread(filesorg,buffer,sizeof(buffer),recordletti);
form1.ProgressBar1.Min := 0;
form1.ProgressBar1.Max := recordletti;
form1.progressbar1.Position := recordletti;
while recordletti > 0 do
begin
   blockwrite(filedest,buffer,sizeof(buffer));
   blockread(filesorg,buffer,sizeof(buffer),recordletti);
   form1.ProgressBar1.Position := form1.ProgressBar1.position + recordletti;
end;

close(filesorg);
close(filedest);
form1.label2.Visible := true;
form1.label1.Caption := '' ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//apre la finestra di scelta del file
if opendialog1.Execute then
    begin
      nome1 := form1.OpenDialog1.FileName;
      label1.Caption := nome1;
    end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  label2.Visible := false;
  form1.progressbar1.Position := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if savedialog1.Execute then
    begin
      nome2 := savedialog1.FileName;
    end;
  copia;
end;

initialization
  {$I unit1.lrs}

end.

Ultima modifica effettuata da il 20/04/2010 alle 21:54
PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 22:20
Martedì, 20/04/2010
si ma così non hai usato un thread separato... in questo modo io avrei lo stesso problema: mentre cerca di sviluppare la procedura COPIA il programma non fa altro... e sono punto a capo...

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:54
Giovedì, 22/04/2010
Prova questo :

a me funziona ..
solamente che dopo la prima copia la memoria occupata sale di colpo..
guarda il task menager


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ComCtrls, ExtDlgs{,windows};

type



ThreadCopia = class(TThread)
   private

   procedure copiafile;

   protected

   Procedure Execute; override;//in execute si mette il codice da eseguire

   public

   constructor Create(CreateSuspended: boolean);

    end;



  { TForm1 }

  TForm1 = class(TForm)
    Button1 : TButton;
    Button2 : TButton;
    Label1 : TLabel;
    Label2 : TLabel;
    OpenDialog1 : TOpenDialog;
    ProgressBar1 : TProgressBar;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);

  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation


var
filesorg,
filedest : file;
recordletti : int64;
buffer : array[1..1000] of byte;
nome1,
nome2 : string;
//il thread
th :  ThreadCopia;

//mi scuso se non applico bene le regole di modularita'
//ma e' solo un esempio
procedure copia;
begin
Assign(filesorg,nome1);
{$I-}
reset(filesorg,1);
{$I+}
if ioresult <> 0 then
   showmessage('Errore');
   // o se no :  messagebox(form1.handle,'Errore!','',MB_ICONERROR);
Assign(filedest,nome2);
{$I-}
rewrite(filedest,1);
{$I+}
if ioresult <> 0 then
   showmessage('Inserire il nome del file!');
blockread(filesorg,buffer,sizeof(buffer),recordletti);
form1.ProgressBar1.Min := 0;
form1.ProgressBar1.Max := recordletti;
form1.progressbar1.Position := recordletti;
while recordletti > 0 do
begin
   blockwrite(filedest,buffer,sizeof(buffer));
   blockread(filesorg,buffer,sizeof(buffer),recordletti);
   form1.ProgressBar1.Position := form1.ProgressBar1.position + recordletti;
end;

close(filesorg);
close(filedest);
form1.label2.Visible := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//apre la finestra di scelta del file
button1.visible := true;
if opendialog1.Execute then
    begin
      nome1 := form1.OpenDialog1.FileName;
      label1.Caption := nome1;
    end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  label2.Visible := false;
  form1.progressbar1.Position := 0;
  form1.label1.Caption := 'Nome del file : ' ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  th := threadcopia.Create(true);
end;






procedure TForm1.Button1Click(Sender: TObject);
begin

  if savedialog1.Execute then
    begin
      nome2 := savedialog1.FileName;
    end;
  if (nome2 <> '') and (nome1 <> '')   then
    th.Execute;

end;


////////  DEFINIZIONE DELLO THREAD ///////////////////////////////////////////////////


constructor threadcopia.Create(CreateSuspended : boolean);
begin
    FreeOnTerminate := True;
    inherited Create(CreateSuspended);
end;

procedure threadcopia.copiafile;
begin
  copia;
end;

procedure threadcopia.Execute;
begin
  Synchronize(@copiafile);
end;

initialization
  {$I unit1.lrs}

end.
                                                      

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 17:27
Giovedì, 22/04/2010
ciao ho visto un po' il tuo codice... grazie mille...
Io avevo portato questo codice in Delphi 2010:
Codice sorgente - presumibilmente Delphi

  1. unit MainUnit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ExtCtrls, ComCtrls, Grids, StdCtrls, Menus, GIFImg, pngimage, MPlayer;
  8. var Source, Destination : String;
  9. type
  10.   TMainForm = class(TForm)
  11.       (*... Qui ci sono tutte le dichiarazioni della form ...*);
  12. end;
  13.  
  14.   type ThreadCopy = class(TThread)
  15.  
  16.      private
  17.  
  18.      public
  19.      protected
  20.      Procedure Execute; override;
  21. end;
  22.  
  23. Const FilesFolder = 'files\';
  24. var
  25.   MainForm: TMainForm;
  26.   NumCanti: byte;
  27.   i : byte = 0;
  28. implementation
  29.  
  30. {$R *.dfm}
  31.  
  32. procedure ThreadCopy.Execute;
  33. var
  34.     newStatus : string;
  35.     FromF,
  36.     ToF        : file of byte;
  37.     Buffer     : array[0..4096] of char;
  38.     NumRead    : integer;
  39.     FileLength : longint;
  40.     Qualcosa   : real;
  41. begin
  42.  
  43.   AssignFile(FromF,Source);
  44.   reset(FromF);
  45.   AssignFile(ToF,Destination);
  46.   Rewrite(ToF);
  47.   FileLength:=FileSize(FromF);
  48.   MainForm.Progressbar1.Max := FileLength;
  49.     while FileLength > 0 do
  50.     begin
  51.       BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead);
  52.       FileLength := FileLength - NumRead;
  53.       BlockWrite(ToF,Buffer[0],NumRead);
  54.       MainForm.Progressbar1.Position := MainForm.Progressbar1.Position + NumRead;
  55.       Qualcosa:= (MainForm.ProgressBar1.Position / MainForm.Progressbar1.Max) *100;
  56.       //MainForm.Image1.Width := Trunc((374 * Qualcosa) / 100);
  57.       MainForm.Label2.Caption:= IntToStr(Trunc(Qualcosa)) + ' %';
  58.     end;
  59.     CloseFile(FromF);
  60.     CloseFile(ToF);
  61.   ShowMessage('File Copiato con successo!');
  62.   MainForm.ProgressBar1.Position:=0;
  63.   MainForm.ProgressBar1.Visible := False;
  64.   MainForm.Label2.Visible := False;
  65.   Terminate;
  66. end;
  67.  
  68. procedure TMainForm.OriginaleMP31Click(Sender: TObject);
  69. var i:byte; n,s:string;
  70.     f:textfile;
  71. begin
  72. n:= StringGrid1.Cells[0,StringGrid1.Row];
  73. s:= StringGrid1.Cells[1,StringGrid1.Row];
  74. Source:= GetCurrentDir+'\'+FilesFolder+n+'\'+n+'a.mp3';
  75. With SaveDialog1 do
  76. begin
  77. for i:=1 to length(s) do
  78.    if s[i] = ':' then s[i]:= ',';
  79.   SaveDialog1.Title:= 'Salva sul pc Originale Mp3';
  80.   SaveDialog1.Filter:= 'Originale MP3 (*.mp3) | *.mp3';
  81.   SaveDialog1.FileName:= StringGrid1.Cells[0,StringGrid1.Row] + ' - ' + s+'.mp3';
  82.   SaveDialog1.Execute;
  83.   if not(SaveDialog1.FileName = '') then
  84.      begin
  85.           ProgressBar1.Visible := True;
  86.           Label2.Visible := True;
  87.           Destination:= SaveDialog1.FileName;
  88.           //ShowMessage('Source: '+Source);
  89.           //ShowMessage('Destination: '+Destination);
  90.           ThreadCopy.Create(False);
  91.      end;
  92. end;
  93. end;
  94.  
  95. end.



Di per sè funziona molto bene... Solo che non riesco a far terminare il Thread... Cioè non riesco ad usare un comando dall'esterno, tipo un bottone della form, per bloccare il Thread... Hai dei consigli?
grazie mille comunque di tutto

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:49
Venerdì, 23/04/2010
prova ad impostare la proprieta' terminated a true. O se no usi direttamente la procedura.

PM Quote
Avatar
Daf (Normal User)
Pro


Messaggi: 78
Iscritto: 27/06/2009

Segnala al moderatore
Postato alle 17:34
Domenica, 09/05/2010
Ho trovato l'errore nel codice:
  Quando crei il Thread per poi poterlo fermare devi "salvarlo" cioè
Codice sorgente - presumibilmente Delphi

  1. var
  2.   Copia: TNomeOggettoThread;
  3. begin
  4.   Copia := TNomeOggettoThread.Create(False);
  5. end;
  6.  
  7. procedure Bottone1(Sender: TObject);
  8. begin
  9.   Copia.Terminate;
  10. end;


:k:

Ultima modifica effettuata da Daf il 09/05/2010 alle 17:35
PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 23:48
Sabato, 15/05/2010
ciao. Ho provato a fare esattamente quello che hai detto... ma la copiatura continua...
Non riesco a capire dov'è l'errore...

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo