Newsgroup: it.comp.lang.delphi
Titolo: Thread....perchè non sono "concorrenti" ?

Salve!
Prima volta con i thread....(android) e non capisco perchï¿œ non sono 
"paralleli" come esecuzione...
 
Nel click di un bottone faccio partire n thread (ogni thread fa il suo 
lavoro....), ma a quanto pare le "execute" si susseguono non 
"velicissime"...come se aspettassero il termine del precedente thread....
 
Ecco qua il codice che ho scritto (scorro una listbox leggendo da un 
file ini delle corrispondenze,imposto delle bitmap e poi faccio partire 
un thread per ogni riga della listbox):
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
arraycheck: array of TThreadSMS; 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
hostinitmp:TInifile;
begin
SetLength(arraycheck,lbnicks.Items.Count); //parte da zero!!!!
hostinitmp:=TIniFile.Create(System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, 
'nicknames.ini'));
 
for i:=0 to lbnicks.Items.Count-1 do // metto tutte le bandierine a blu
  begin
  lbnicks.ListItems[i].ItemData.Bitmap:=Image1.MultiResBitmap[3].Bitmap; 
//tutti a blu
  end;
 
for i:=0 to lbnicks.Items.Count-1 do //i threads partono tutti stoppati
  begin
   arraycheck[i]:=TThreadSMS.create(true); //stoppato
   arraycheck[i].itemindextocheck:=i; //passo delle variabili
 
arraycheck[i].hosttocheck:=hostinitmp.ReadString(lbnicks.items[i],'hostname',''); 
//passo un'altro valore
//  arraycheck[i].Execute; //eseguo dopo...prima preparo i thread
   application.ProcessMessages; //magari aiuta...
  end;
hostinitmp.Free;
 
for i:=0 to lbnicks.Items.Count-1 do
  begin
  arraycheck[i].Execute; //partenza!
  application.ProcessMessages; //magari aiuta...
  end;
 
//while tsms.Finished=False do
//begin
//application.ProcessMessages;
//end;
end;
 
 
 
 
 
Il problema ï¿œ che il bottone che scatena il tutto rimane "premuto" 
finchï¿œ i thread non finiscono, e i thread si attivano quando finisce il 
precedente....
 
 
 
 
Questa ï¿œ unit del thread per intero:
 
 
 
 
 
unit ThreadSMS;
 
interface
 
uses
   System.SysUtils, System.Types, System.UITypes, System.Classes, 
System.Variants,
   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 
FMX.Effects,
   FMX.StdCtrls, FMX.Ani, FMX.Edit, FMX.Objects, IniFiles, 
System.IOUtils, FMX.VirtualKeyboard,
   FMX.ListView.Types, FMX.ListView, FMX.ListBox, FMX.Layouts, FMX.Gestures,
   IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, FMX.Media,
   IdCustomTCPServer, IdTCPServer, IdContext, IdGlobal, 
FMX.Notification,FMX.Platform,
   IdDNSResolver,IdStack;
 
type TThreadSMS=class (TThread)
  procedure Execute; override;
  public
  itemindextocheck:integer;
  hosttocheck:string;
 
end;
 
 
implementation
 
uses unitmain;
 
procedure TThreadSMS.Execute;
var
i:integer;
hostoreach:string;
IP: string;
IdTCPSMSCheck: TIdTCPClient;
begin
IdTCPSMSCheck:=TIdTCPClient.Create(nil);
IdTCPSMSCheck.Host:=hosttocheck;
IdTCPSMSCheck.Port:=8090;
IdTCPSMSCheck.ConnectTimeout:=2000;
  try
   application.ProcessMessages;
 
Form1.lbnicks.ListItems[itemindextocheck].ItemData.Bitmap:=Form1.Image1.MultiResBitmap[2].Bitmap; 
//giallo
   IdTCPSMSCheck.Connect;
   application.ProcessMessages;
 
Form1.lbnicks.ListItems[itemindextocheck].ItemData.Bitmap:=Form1.Image1.MultiResBitmap[1].Bitmap; 
// verde
   application.ProcessMessages;
   IdTCPSMSCheck.Disconnect;
   application.ProcessMessages;
  except
 
Form1.lbnicks.ListItems[itemindextocheck].ItemData.Bitmap:=Form1.Image1.MultiResBitmap[0].Bitmap; 
//rosso
   application.ProcessMessages;
  end;
IdTCPSMSCheck.Free;
end;
 
end.
 
 
 
 
 
 

 "paralleli" come esecuzione...
 
Li hai codificati in modo che non possano eseguire in modo parallelo.
 
Il metodo "Execute" non va chiamato direttamente; inoltre, non ha molto senso l'uso di Application.ProcessMessages all'interno dei thread, visto che eseguono appunto in modo asincrono, per cui non sarebbe necessario, a patto di chiamare i metodi giusti.
 
Leggi questo tutorial datato ma sempre attuale:
https://groups.google.com/forum/#!msg/it.comp.lang.delphi/-VQPoP7YT-g/riAOHosL75sJ
 
 
Fai riferimento alla documentazione per ulteriori approfondimenti:
http://docwiki.embarcadero.com/RADStudio/XE6/en/Writing_Multithreaded_Applications_Index
 
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI (Software and Web Developer)
#Home: 
http://bit.ly/marcobreveglieri
 
#Blog: 
http://bit.ly/compilaquindiva
 


Potrebbe sembrare che voglia controbbaterti...ma NON e' cos�! vorrei 
solo capire il perch� delle tue affermazioni.
Ti ringrazio tanto !!!!!!!!!!!

 essere eseguiti in modo pallelo, in fondo non interagiscono tra di loro.
 
Perché non devi chiamare il metodo "Execute".
Tutto qua.
 
O almeno, questo è un passo fondamentale, poi per il seguito si vede. :)


 
 
Sono fuori sede, quindi non posso provare.... 
Perch� per� se il parametro di creazione lo metto a false, fa lo
 stesso difetto? 
 
Ripeto.... Sono fuori... 
Cmq provo stasera! 
-- 
 
 
----Android NewsGroup Reader----
http://piaohong.appspot.com/newsgroup
 

 stesso difetto?
 
Se il parametro "CreateSuspended" è a False, il thread parte immediatamente.
 
Bisogna vedere però come li gestisci in seguito: ad esempio, chiami ugualmente il metodo "Execute" nella tua implementazione? E come fai a rilevare quando il lavoro dei thread è terminato?


Ho ripulito il codice...e SEMBRA funzionare...
Puoi dirmi se vedi qualche errore?
 
Questo è il thread:
 
unit ThreadSMS;
 
interface
 
uses
   System.SysUtils, System.Types, System.UITypes, System.Classes, 
System.Variants,
   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 
FMX.Effects,
   FMX.StdCtrls, FMX.Ani, FMX.Edit, FMX.Objects, IniFiles, 
System.IOUtils, FMX.VirtualKeyboard,
   FMX.ListView.Types, FMX.ListView, FMX.ListBox, FMX.Layouts, FMX.Gestures,
   IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, FMX.Media,
   IdCustomTCPServer, IdTCPServer, IdContext, IdGlobal, 
FMX.Notification,FMX.Platform,
   IdDNSResolver,IdStack;
 
type TThreadSMS=class (TThread)
  procedure Execute; override;
  procedure UpdateListBox;
  public
  itemindextocheck:integer;
  hosttocheck:string;
  col:integer;
end;
 
 
implementation
 
uses unitmain;
 
procedure TThreadSMS.Execute;
var
i:integer;
IP: string;
IdTCPSMSCheck: TIdTCPClient;
begin
IdTCPSMSCheck:=TIdTCPClient.Create(nil);
IdTCPSMSCheck.Host:=hosttocheck;
IdTCPSMSCheck.Port:=8090;
IdTCPSMSCheck.ConnectTimeout:=2000;
col:=2;
  try
   IdTCPSMSCheck.Connect;
   IdTCPSMSCheck.Disconnect;
   col:=1;
  except
   col:=0;
  end;
IdTCPSMSCheck.Free;
Synchronize(UpdateListBox);
end;
 
procedure TThreadSMS.UpdateListBox;
begin
  Form1.lbnicks.ListItems[itemindextocheck].ItemData.Bitmap:=
     Form1.Image1.MultiResBitmap[col].Bitmap;
end;
 
end.
 
 
 
 
 
 
 
 
e questo è l'onclick:
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
arraycheck: array of TThreadSMS;
hostinitmp:TInifile;
begin
SetLength(arraycheck,lbnicks.Items.Count); //parte da zero!!!!
hostinitmp:=TIniFile.Create(System.IOUtils.TPath.Combine(
        System.IOUtils.TPath.GetDocumentsPath,'nicknames.ini'));
 
for i:=0 to lbnicks.Items.Count-1 do // metto tutte le bandierine a blu
  begin
  lbnicks.ListItems[i].ItemData.Bitmap:=Image1.MultiResBitmap[3].Bitmap;
  end;
 
for i:=0 to lbnicks.Items.Count-1 do //i threads partono tutti stoppati
  begin
   arraycheck[i]:=TThreadSMS.create(True); //stoppato
   arraycheck[i].itemindextocheck:=i; //passo delle variabili
arraycheck[i].hosttocheck:=hostinitmp.ReadString(lbnicks.items[i],'hostname','');
   application.ProcessMessages; //magari aiuta...
  end;
hostinitmp.Free;
 
for i:=0 to lbnicks.Items.Count-1 do
  begin
  lbstat.text:=arraycheck[i].hosttocheck;
  arraycheck[i].Start; //partenza!
  end;
end;
 
 
 
 
PS: Che newsserver usi?

 Per avviare il thread devi usare il metodo "Resume".
 
O meglio "Start". Il metodo "Resume" e` 'deprecated'.

 O meglio "Start". Il metodo "Resume" e` 'deprecated'.
 
Sì, ma volevo mantenermi in linea con l'esempio del tutorial per non aggiungere ulteriore confusione oltre a quella che già c'era, ma poi dal codice postato direi che la strada giusta è stata comunque presa. :)
 
Ciao!


[OT] Che news server usate? 
news.tin.it
 fa cagare....
nntp.aioe.org
 mi 
rompe con la lunghezza delle righe....

 rompe con la lunghezza delle righe....
 
Google Groups :)
https://groups.google.com
 


 rompe con la lunghezza delle righe....
 
 
http://diesel.cu.mi.it/
 
 
 
 
 
-- 
Mai mettersi a discutere con un idiota:
- prima ti porta al suo livello e poi ti batte con l'esperienza;
- chi ascolta potrebbe non capire la differenza.