Newsgroup: it.comp.programmare.win32
Titolo: Thread qualche delucidazione ( lunghetto )

Ciao a tutto il news, avrei bisogno di qualche delucidazione per quanto
riguarda i thread, premetto che utilizzo il BCB 3.0 ho provato ad
utilizzarne uno per leggere i record di un file database "casereccio" in
una StringGrid, tutto funziona egregiamente, ma qualche dubbio mi assale
essendo la prima volta che utillizzo questi thread..., vi riporto di
seguito un frammento di codice e qualche quesito:
///////// apro la form faccio partire il thred leggo tutto e lo termino
quando chiudo la finestra//////////
void __fastcall TFormGrid::FormShow(TObject *Sender)
{
   ThFileOp = new FileOp(false);
}
void __fastcall TFormGrid::FormClose(TObject *Sender, TCloseAction
&Action)
{
   ThFileOp->Terminate();
}
///////////////////////////////////il thread/////////////////////////
char buf[111];
void __fastcall FileOp::Execute()
{
  HANDLE fin;
  DWORD dwBW,err;
  int nrec,cn;
  FreeOnTerminate = true;
  SetLastError(0);
fin=CreateFile("miofile.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  err=GetLastError();
  if(err != NO_ERROR && err != ERROR_ALREADY_EXISTS) return;
   nrec=GetFileSize(fin,NULL)/110;
  for(cn=0;cn<nrec;cn++)
   {
      if(Terminated)
       {
         CloseHandle(fin);
         return;
       }
     ReadFile(fin,buf,110,&dwBW,NULL);
     Synchronize(MakeGrid);
   }
  CloseHandle(fin);
}
void __fastcall FileOp::MakeGrid()
{
    //qui ci riempio la grid...
}
... il thread conviene terminarlo quando termina il ciclo for oppure
quando chiudo FormGrid, se scelgo la prima soluzione sarebbe corretto
inserire dopo il CloseHandle();  del thread
FormGrid->ThFileOp->Terminate(); ( ho provato e sembra funzionare bene
anche cosě )
... se io scrivessi un codice diverso (niente a che vedere con quello
sopra ) ->
void __fastcall TFormGrid::FormShow(TObject *Sender)
{
   ThFileOp = new FileOp(false);
}
void __fastcall TFormGrid::FormClose(TObject *Sender, TCloseAction
&Action)
{
   ThFileOp->Terminate();
}
void __fastcall TFormGrid::ButtonStartClick(TObject *Sender)
{
   ///??????
}
///////////////////////////////////il thread/////////////////////////
void __fastcall FileOp::Execute()
{
  int cn;
  while(true)
   {
        if(Terminated) return;
        Whait...(????);
        for(cn=0;cn<1000;cn++)
         {
            //faccio qualsiasi cosa....
         }
   }
}
...come faccio a far partire il contatore premendo ButtonStart
utilizzando una delle funzione Whait......(), se qualcuno avvesse voglia
di completare il mio pezzo di codice mi farebbe cosa gradita (un esempio
vale  + di 1000 parole ;-) )))
Ringrazio tutti anticipatamente, scusatemi se mi sono prolungato  CIAO e
GRAZIE Dave.
P.S [OT] vorrei postare piu frequentemente ma i post che invio con Tim
ADSL non li caga nessuno, e ho scoperto che con  Libero non vengono
scaricati e visualizzati mentre se li riscarico con Tim tutto č Ok,
qualcuno ne conosce il motivo ?

Il thread ti conviene sempre lasciarlo finire normalmente.
Con TThread la parte asincrona deve testare e reagire a this->fTerminated il
più frequentemente e velocemente possibile. In questo modo se devi
interromperlo ti basta una cosa del genere:
this->Terminate ();
this->WaitFor ();
per finire in modo pulito interrompendo l'esecuzione del thread.
Se devi avviarlo a comando ti faccio notare che nel costruttore c'è un
parametro per metterlo subito in sospensione (questo almeno dal BCB4).
TThread::TThread (bool CreateSuspended);
e quando ti serve lo attivi con una:
this->Resume ();
In questo caso non stonerebbe aggiungere il test di this->fTerminated come
prima tra le cose svolte dal thread.
In questo modo se devi chiudere tutto senza attivare il thread, una cosa del
genere dovrebbe essere sufficiente:
this->Terminate ();
this->Resume ();
this->WaitFor ();
Saluti ;)
--------------------------------
Inviato via 
http://usenet.libero.it