Newsgroup: it.comp.lang.delphi
Titolo: incubo Thread

Ciao a tutti, da parcchio tempo programmo in c++ e vb ma in queste settimane
devo fare un lavoretto in Delphi 6 e sinceramente ho seri problemi per le
thread .....
Ma come si usano?
Io implemento un mio:
TTHSocket = class(TThread)
           constructor Create;
           procedure Execute; override;
   end;
Naturalmente ho anche la mia form del tipo
TForm1 = class(TForm)
     BT_01: TButton;
    Button1: TButton;
    Button2: TButton;
    lista: TListBox;
    procedure Prova();
    ......
  private
    { Private declarations }
  public
    { Public declarations }
  protected
  end;
Adesso dal tasto Button1 voglio aprire la mia thread che lanci la procedura
prova e faccio:
procedure TForm1.Button1Click(Sender: TObject);
begin
        TTHSocket.Create();
end;
constructor TTHSocket.Create;
begin
 inherited Create(false);
?????????????????????????????????????????????????????????????????????
   Ma qui come faccio a vedere la mia TForm1.Prova???????????????????????
?????????????????????????????????????????????????????????????????????
end;
Magari ho sbagliato approccio nelle thread perchč il materiale in rete non č
molto.....
Chi mi puň dare una mano.
la mia intenzione č solo aprire con una thread una o piů procedure contenute
magari nel form, nello specifico
devo aprire una socket in una thread separata e quindo voglio pilotare da
una funzione eseguita come thread l'oggettino clientsocket.
Ciao e grazie

 una funzione eseguita come thread l'oggettino clientsocket.
mi sono perso.
A te serve avere + socket? Forse i thread non ti servono.
Ti serve che ogni thread abbia il prp socket oppure, dati n socket 
attivi, puoi avere + thread che usano di volta in volta un socket diverso?
I socket sono sincroni o asincroni?
Tralasciando vb, in c++ hai mai usato i thread?
Intanto, giusto x iniziare, vedi i data module, che sono gli oggetti 
ideali x contenere la logica; i form servono solo x interfaccia utente.
AS

 thread .....
Ne abbiamo parlato proprio oggi:
http://makeashorterlink.com/?R206130F8
Vedi se ti puo' servire.
Ciao.
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

OK, penso di non essermi spiegato bene quindi vi spiego e riporto il codice
( tagliando quello che non serve ) che vorrei funzionasse.
Ho una normale form con un tasto e un oggettino TClientSocket.
Io perň voglio aprire questa connessione tramite una thread che faccia la
connessione e resti in verifica del suo stato, se per caso la socket cade
deve riprovare fino a che non si riconnette.
Io ho fatto cosě.
//*****************************************************************
unit Principale;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, VidGrab, StdCtrls, ScktComp;
type
    TForm1 = class(TForm)
    winsck: TClientSocket;
    Button1: TButton;
    Button2: TButton;
    procedure connetti();
    procedure testConn();
    procedure Button2Click(Sender: TObject);
    procedure winsckConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure winsckError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  protected
end;
TTHSocket = class(TThread)
    constructor Create;
    procedure Execute; override;
end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
constructor TTHSocket.Create;
begin
 inherited Create(false);
 MessageDlg('Thread Create', mtInformation,[mbOk], 0);
end;
procedure TTHSocket.Execute;
 var success: Boolean;
 var plutooo: integer;
begin
 MessageDlg('Thread Execute', mtInformation,[mbOk], 0);
 Form1.connetti();
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
        TTHSocket.Create();
end;
procedure Tform1.connetti();
begin
       winsck.Host := '192.168.0.69';
       winsck.Port := 502;
       winsck.Active := true;
        testConn();
end;
procedure Tform1.testConn();
begin
        while (winsck.Socket.Connected = true) do
        begin
                Sleep(300);
        end;
        connetti();
end;
//*****************************************************************
La socket perň non si apre........
Avete idee? Magari potrei gestire il controllo della connessione aspettando
l'evento "winsckError" o altro
ma non vedo perchč non debba funzionare quello che ho scritto.
Chi mi aiuta?
Grazie mille

 deve riprovare fino a che non si riconnette.
non ti servono i thread. Puoi fare queste cose qui:
1) il tclientsocket ha degli eventi che puoi utilizzare per intercettare 
  alcuni cambi di stato della connessione. Su quelli relativi alla 
interruzione della connessione puoi lanciare una riapertura.
2) Se il tuo problema è che la connessione va giu quando non viaggiano 
dati per un determinato tempo, puoi usare un timer nel cui evento fai il 
check su un contatore di secondi che, se raggiunto il tempo limite, 
invia un pacchetto fake. Il contasecondi viene ovviamente azzerato ad 
ogni ricezione/invio
Occhio: se il cliente ha una isdn, ti *ammazza* se usi questa tecnica... ;)
3)  Se il problema è *accorgersi* che a basso livello il socket è stato 
chiuso, esistono delle api winsock che presumo chi scrive in c++ conosca 
1000 volte meglio di chi lavora in delphi
4) infine, un suggerimento. se puoi, molla tclientsocket e vedi gli indy.
AS

 rete non è molto.....
In rete c'è del materiale. Due dei link che a me piacciono di più, e
che sono già stati citati spesso nel newsgroup sono:
http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
http://sklobovsky.nstemp.com/community/threadmare/perks.htm
guastatore

1) Se non vuoi problemi, quando chiami un'istanza di una classe della VCL
dovresti passare per TThread.Synchronize(), oppure usando un Critical
Section o simili per proteggere l'accesso.
2) Quando termina il metodo Execute, termina anche il thread. Se vuoi che
il thread resti attivo devi usare la proprietà Terminated per vedere
quando deve uscire, e fare un loop finché non è true.
3) Perché il loop di controllo è nel codice del form? Quando schiacci il
tasto il form va in sleep e non risponde più ai messaggi... a che ti serve
il thread se non lo usi per il polling?
È sbagliata la logica dell'applicazione.
Io farei così:
1) Alla pressione del pulsante istanzi il thread.
2) Il thread apre la connessione e poi si pone in un ciclo per verificare
se la connessione cade, nel qual caso la riapre.
3) Per fermare il thread, chiami TThread.Terminate e nel codice
dell'execute controlli quando Terminated è a True ed esci.
4) Ricordati di proteggere l'accesso alle variabili "condivise", ad
esempio il form o il socket, perché se due thread (ad esempio quello
principale - che esiste sempre - ed il tuo) accedono contemporaneamente
vai incontro a problemi.
Comunque la programmazione multithread è tutt'altro che banale, cerca un
po' di documentazione (a partire dal manuale di Delphi, dove c'è almeno
una introduzione).
Luigi D. Sandon - D&amp;D Support Team
--- posted by geoForum on 
http://www.delphiedintorni.it

 ha scritto nel messaggio
news:41592...@news.telnetwork.it...
