Oppure

Loading
19/04/10 11:50
a_butta
Ciao a tutti.
Il mio problema riguarda l'esecuzione di più processi contemporaneamente.
Ho un programma che oltre a svolgere altre funzioni copia dei determinati file da una cartella all'altra con relativa ProgressBar e label indicante l'avanzamento.
Soltanto che quando inizia a copiarmi il file sembra che la finestra si blocchi e non mi lascia usare il programma finchè non abbia finito... Oltre a questo la progressbar diventa invisibile non perchè non funziona ma perchè proprio si arresta il programma, come se lavorasse "da solo" per riapparire alla fine della copiatura...
Come posso ovviare a questo problema?

Grazie mille
aaa
19/04/10 12:18
nessuno
Non si tratta di eseguire più processi, ma più thread all'interno del tuo processo.

Se il processo che esegue la copia lo fa utilizzando lo stesso thread di quello che si occupa del ridisegno della finestra, ecco che hai il problema di cui lamenti (o il thread fa la copia o ridisegna la finestra).

Se il thread che fa la copia, utilizza un ciclo, potresti forzare il thread stesso ad occuparsi ogni tanto del ridisegno con una chiamata come la DoEvents per il VB (non so se in Delphi esiste qualcosa del genere). Se il thread è bloccato su una singola API, allora l'unico modo è creare un altro thread che si occupi della copia, lasciando il thread dell'interfaccia libero di lavorare.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
19/04/10 12:23
a_butta
mmmh... bene... è la prima volta che sento parlare di thread...
Come si fa a "creare" un altro thread?
aaa
19/04/10 12:27
nessuno
Postato originariamente da a_butta:

mmmh... bene... è la prima volta che sento parlare di thread...


Non bene ... l'argomento thread non è semplicissimo e se non ne hai sentito mai parlare, non mi sembra il caso di affrontarlo in una risposta di un forum ...

Come si fa a "creare" un altro thread?


Forse questa guida

programmazione.html.it/guide/lezione/1231/sviluppo-di-applicazioni-multithread/

potrà aiutarti ... altrimenti, dovrai munirti di un buon testo (come ti consiglio di fare) e imparare con pazienza e applicazione ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
19/04/10 13:28
Dato che usi lazarus prendi questi due link:

freepascal.org/docs-html/prog/…


wiki.lazarus.freepascal.org/…


Tutte queste informazioni le ho studiate da solo e non da qualcuno.
Quindi informati meglio dopo averle lette.

A me sembra che tu non abbia capito bene il concetto di processo:
brevemente ,un processo e' come un programma in esecuzione unito alle sue informazioni di stato(memoria ,registri,I/O , ecc..).

Il thread praticamente o e' il processo stesso,quando non ne crei,o e' una parte di un processo che condivide con lui tutte le sue informazioni.(ricordando che l'altra parte di processo e' anche essa un thread).

La difficolta' nell'uso dei thread sta nel sincronizzarli: per esempio devi stare attento al loro accesso alla memoria: infatti se due thread acceddono nello stesso momento ad uno stesso contenuto creano dei problemi all'esecuzione del programma.

Ultima cosa e' che quando crei un nuovo thread esso non occupa nuova memoria,ma condivide la stessa del processo. Ed e' questo che li rende tanto efficenti.(oltre sicuramente a svolgere lavoro in contemporanea come se si avessero piu' processori).


Ultima modifica effettuata da 19/04/10 13:43
19/04/10 16:20
a_butta
grazie mille delle informazioni. Sei stato veramente gentile.:hail:

Io ho provato a buttare giù un codice per la copiatura dei file. L'ho fatto prima in Delphi7 e poi l'ho portato su Lazarus. Nel primo funziona alla grande. Il secondo invece mi blocca letteralmente il computer: devo resettarlo.
Posto il codice:

unit saveunit;

{$mode objfpc}{$H+}

interface

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

  var Source,Destination: string;

type

  { TSaveForm }

  TSaveForm = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ProgressBar1: TProgressBar;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure ProgressBar1ContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);

  private
    { private declarations }
  public
    { public declarations }
  end; 

type  TCopyProcedure = class(TThread)
     private
     public
     protected
     Procedure Execute; override;
end;

var
  SaveForm: TSaveForm;

implementation
  uses mainunit;
{ TSaveForm }


procedure TCopyProcedure.Execute;
var
  FromF,
  ToF        : file of byte;
  Buffer     : array[0..4096] of char;
  NumRead    : integer;
  FileLength : longint;
begin
  AssignFile(FromF,Source);
  reset(FromF);
  AssignFile(ToF,Destination);
  Rewrite(ToF);
  FileLength:=FileSize(Source);
  SaveForm.Progressbar1.Max := FileLength;
    while FileLength > 0 do
    begin
      BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF,Buffer[0],NumRead);
      SaveForm.Progressbar1.Position := SaveForm.Progressbar1.Position + NumRead;
      SaveForm.Label2.Caption:= IntToStr(Trunc((SaveForm.Progressbar1.Position * 100)/SaveForm.Progressbar1.Max)) + ' %';
    end;
    CloseFile(FromF);
    CloseFile(ToF);
  ShowMessage('File Copiato con successo!');
  SaveForm.ProgressBar1.Position:=0;
  SaveForm.Close;
end; 


Da un'altra unit io imposto precedentemente i valori di Source e di Destination e poi lancio il comando:
SaveUnit.TCopyProcedure.Create(False);


Risultato: errore in runtime. Non riesco a capire che errore è perchè proprio mi blocca il computer.

Riesci a trovarci qualche errore in quel codice?
Ultima modifica effettuata da a_butta 19/04/10 16:21
aaa
19/04/10 17:47
nessuno
Solo per la precisione ...

Postato originariamente da Saladino:
Il thread praticamente o e' il processo stesso,quando non ne crei,o e' una parte di un processo che condivide con lui tutte le sue informazioni.(ricordando che l'altra parte di processo e' anche essa un thread).


Un thread è un "percorso di esecuzione" tra i tanti disponibili per un processo.
Un processo è costituito almeno da un thread (sono concetti diversi) che viene creato automaticamente dal sistema operativo (un thread non e' il processo).
Non c'è "una parte e l'altra parte" dato che i thread possono essere tanti, sicuramente piu' di 2 ...

Ultima cosa e' che quando crei un nuovo thread esso non occupa nuova memoria


Non è esattamente così ... un thread può occupare memoria indipendentemente da altri thread. Semmai si deve dire che i thread condividono lo stesso "spazio di indirizzamento" del processo.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
20/04/10 5:46
si era quello che intendevo.
Solo che tu sei stato più preciso.
Ultima modifica effettuata da 20/04/10 5:48