Newsgroup: it.comp.lang.delphi
Titolo: Info sui threads

Salve a tutto il newsgroup.
Sono uno studente di 18 anni che ha iniziato da poco a studiare delphi. Sto
cercando di fare un programma per la maturità e avrei bisogno di utilizzare
dei threads, solo che non ho la benché minima idea di come poter fare per
crearli, gestirli, eliminarli ecc... L'unica cosa che credo di aver capito è
che i threads permettono di creare e gestire processi "concorrenti" (scusate
se sbaglio il termine ma a me è stato detto così) ovvero che "sembrano"
muoversi allo stesso tempo. Di più non so :-(
Vorrei chiedere se poteste darmi qualche link dove reperire informazioni
possibilmente in italiano su tale argomento (La mia conoscenza dell'inglese
tende a 0)...
... accetto anche programmi già fatti possibilmente ben commentati che
spieghino in modo esauriente l'argomento in oggetto.
Grazie a tutti coloro che mi aiuteranno da un Solid Snake disperato.
--
KNOWLEDGE IS POWER
http://chameleon.go.to

Per il momento ti posso mandare un esempio di gestione dei thread molto
semplice (fatto circa all'una di notte)
alcune cose potrebbero essere inutili su delphi nuovi come ad esempio la
sincronizzazione per l'aggiornamento delle label.
In poche parole mi creo il mio thread, alla partenza lui mi chiama il metodo
"execute" e in questo mi faccio i miei calcoli.
Per il resto gestisce il delphi (a livelli semplici, nel caso di operazioni
di sincronizzazioni piu' complesse dipende anche dalla situazioni... dato
che e' 01:12:00 invio il messaggio e a risentirci).
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
//    procedure ThreadDone(Sender: TObject);
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
type TA = class(TThread)
       Public
       X : Integer;
       Lbl : TLabel;
       constructor Create(L:TLabel);
       procedure Execute; override;
       procedure UpdateCaption;
  end;
// L'aggiornamento dei controlli devi farlo in una funzione che viene
chiamata
// Con "Synchronize"
procedure TA.UpdateCaption;
begin
  Lbl.Caption :=IntToStr(x);
end;
// Assegno la label
constructor TA.Create(L:TLabel);
Begin
  Lbl:=l;
  Inherited Create(False);
End;
// Alla creazione viene chiamata questa funzione che poi mi tengo per il mio
calcolo
procedure TA.Execute;
begin
  While(x<100)do
  Begin
    inc(x);
    Synchronize(UpdateCaption);
  End;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var a,b : TA;
begin
  Label1.Caption := '0';
  Label2.Caption := '0';
  a := TA.Create(Label1);
  b := TA.Create(Label2);
end;

 spieghino in modo esauriente l'argomento in oggetto.
per usare i threads hai due possibilita':
- impapinarti con le API
- usare la classe TThread di Delphi
ti consilgio la seconda, anche perche' mi sebra di capire che non devi
fare cose molto particolari e cmq la classe e' fatta molto bene.
Basta cha fai File-New-Thread, ti crei l'oggetto TThread,
metti il codice del metodo Execute, e poi
- TuoThread.Priority := ...  -> priorita' del thread
- TuoThread.Execute; -> esegue 
- TuoThread.Terminate; -> ferma
poi vedi l'help, e' molto semplice da usare...
Ciao, :)
Alan Solo

Grazie 1000 delle informazioni. Vi farò sapere com'è andata :-)
Se avete anche altre informazioni, potete postarmele anche in privato a
solid...@ngi.it
Ancora grazie


muoversi allo stesso tempo. Di piů non so :-(
I thread sono percorsi di esecuzione indipendenti (i processi sono
/contenitori/ di thread). Per usare i thread con Delphi, puoi usare la
classe TThread. Inoltre, tra i programmi dimostrativi di Delphi 5 c'e'
un esempio di uso dei thread di ordinamento di un insieme di dati.
--
Andrea Laforgia (ICQ 87230455)
"A C program's trick is sometimes a C++ program's trap"
                                          [S.B.Lippman]

 un esempio di uso dei thread di ordinamento di un insieme di dati.
Lo so, l'ho visto, e non ho capito assolutamente niente :"-( I commenti,
oltre che essere in inglese, sono un po' pochi per uno che deve capire come
funzionano i threads da 0. La mia conoscenza dell'inglese tende a 0, come ho
già detto... La mia prof di informatica non capisce una mazza di pascal e
vuole spiegare delphi con dei lucidi proiettati sul muro... Non chiedo aiuto
a lei perché delphi non lo conosce, come non conosce pascal che ci spiega da
3 anni.
Siete la mia sola speranza! Aiutoooooo!


 3 anni.
ti diro', delphi semplifica al massimo (in questo caso come in molti
altri): in pratica hai una classe TThread, e funziona come ogni altro
oggetto (spero che tu sappia qualcosa di prog. ad oggetti... ;))
lo crei, lo distruggi, ne crei piu' istanze ecc.., e' un oggetto
insomma...
ha due metodi importanti
Execute e Terminate (esegui e termina)
per cose semplici non ti serve sapere altro.
Ripeto: fai file-New-Thread object, inserisci il codice in
TTuoThread.Execute e poi, che ne so nell'Onclick di un Button:
var
 T:TTuoThread;
procedure ButtonInizia.Onclick;
begin
  T:=TTuoTread.Create;
  T.Execute;
end;
procedure ButtonFerma.Onclick;
begin
  T.Terminate;
  T.Free;
end;
no l'ho provato, ma il senso e' questo, poi ci sono altre cose che si
possono fare, a seconda delle tue esigenze
spero di averti fatto chiarezza :)
Ciao,
Alan Solo


Avevo anche io una prof di informatica che spiegava con i lucidi sul muro,
percaso il suo cognome aveva 9 lettere con due "z" vicine.

  T:=TTuoTread.Create;
T := TTuoThread.Create( true ) ;
...
T.Resume() ;
oppure
T := TTuoThread.Create( false ) ;
E' importante specificare se lo si vuol creare sospeso (e quindi usare
poi Resume per attivarlo) o meno.
-- 
Andrea Laforgia (ICQ# 87230455) ---------------------------
Non scrivetemi in privato, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------

vuole spiegare delphi con dei lucidi proiettati sul muro... Non chiedo aiuto
Non preoccuparti, la programmazione non si impara a scuola ;)
In termini semplici, un thread puo' essere creato instanziando la
classe TThread di Delphi. E' sempre bene usare le facilita' messe a
disposizione dal sistema di sviluppo, per la creazione dei thread.
Il costruttore della classe TThread accetta un parametro booleano che
se true, fa in modo che il thread venga creato sospeso, nel senso che
viene creato e non parte. Se false, viene creato e fatto partire.
Per "partenza" si intende l'invocazione del metodo Execute().
Se il thread e' sospeso, per farlo partire, basta invocare Resume().
Ci sono, comunque, molte altre cose da sapere.
Come riferimento, puoi consultare l'help di Delphi o il capitolo 11 di
"Delphi 5 Developer's Guide" dei soliti Teixeira and Pacheco.


 poi Resume per attivarlo) o meno.
effetivamente hai ragione, non mi ricordavo di quel parametro
x SD: ti basta sapere che passando true al create il Thread parte subito
altrimenti, l'oggeto viene si' creato, ma il thread resta sospeso
Ciao,
Alan Solo

Ringrazio ancora per l'aiuto. Non so cosa farei se non ci foste voi :))
Nel nome della mia professoressa non ci sono "Z"... per chi volesse vedere
con chi ho a che fare può visitare il sito 
http://iprofessori.cjb.net
Ora vado a fare pratica con i threads. Se avrò problemi, spero non mi
negherete il vostro prezioso aiuto.
Ancora grazie 1000 a tutti.


altrimenti, l'oggeto viene si' creato, ma il thread resta sospeso
E' l'esatto contrario.


 E' l'esatto contrario.
puffhh, 8)
ma la cosa piu' bella sai qual'e'?
... ma sto "SD", da dove cacchio sbuca ???
portate pazienza... ;)
Ciao,
Alan Solo