Newsgroup: it.comp.lang.delphi
Titolo: Query eseguita in un Thread...

Buongiorno a tutti,
Vorrei riuscire ad eseguire una query SQL piuttosto elaborata in un
thread separato affinche' l'applicazione non si "congeli" mentre
attende i dati.
L'idea che avevo era di aprire un thread nel quale eseguire la query e
far si' che venisse mostrato un dialogo di attesa...per poi chiuderlo
a query completata. (non mi interessa tanto la possibilita' di far
fare piu' cose all'utente..la mia priorita' e' far si' che
l'applicativo non sia "congelato"...come se non processasse i messaggi
windows)
Ho provato a fare qualcosa "scopiazzando" in giro per la rete.
(forse non comprendendo appieno la teoria sui Thread)
Ho tirato giu' questo codice che, pero', ogni tanto si blocca...
Ovvero: ogni tanto la query si apre, ma il dialogo rimane li' come se
il thread avviato non capisse che la query e' terminata....
Dove puo' essere l'errore?
Riporto sotto il codice:
//
******************************************************************************
// GESTIONE QUERY IN UN THREAD
//
******************************************************************************
procedure RunBackgroundQuery(DataBase:TDataBase;Query: TSiQuery;
DataSource:TDataSource);
begin
  { Create a TThread instance with the various parameters. }
  TQueryThread.Create(Database, Query, DataSource);
end;
constructor TQueryThread.Create(DataBase:TDatabase; Query: TSiQuery;
Datasource: TDataSource);
begin
  inherited Create(True);    // Create thread in a suspendend state
  FDatabase := DataBase;
  FQuery := Query;
  FDataSource := Datasource;
  FreeOnTerminate := True;   // Have thread object free itself when
terminated
  Resume;                    // Resume thread execution
end;
procedure TQueryThread.Execute;
begin
	try
  try
    { Run the query and connect the datasource to the TQuery
      component by calling ConnectDataSource from main
      thread (Synchronize used for this purpose)}
    Synchronize(MostraAttesa);
    FQuery.Open;
    Synchronize(ConnectDataSource);
  except
    { Capture exception, if one occurs, and handle it in the
      context of the main thread (Synchonize used for this
      purpose. }
    FQueryException := ExceptObject as Exception;
    Synchronize(ShowQryError);
  end;
  finally
    Synchronize(ChiudiAttesa);
  end;
end;
procedure TQueryThread.ConnectDataSource;
begin
  FDataSource.DataSet := FQuery;  // Connect the DataSource to the
TQuery
end;
procedure TQueryThread.ShowQryError;
begin
  Application.ShowException(FQueryException); // Handle the exception
end;
procedure TQueryThread.MostraAttesa;
begin
	Application.CreateForm(TDlgAttesa,DlgAttesa);
	DlgAttesa.Show;
end;
procedure TQueryThread.ChiudiAttesa;
begin
	DlgAttesa.Hide;
            DlgAttesa.Free;
end;
//
******************************************************************************

John Hopfield ha scritto:
<cut>
Conoscere:
* la versione di Delphi;
* il DB;
* il metodo di accesso ai dati;
che usi sarebbe sicuramente utile per poter dare una risposta al tuo
quesito.
Il tuo programma si blocca in attesa dei dati perché:
- è lento il server ad elaborare una query complessa?
- è lenta la rete che utilizzi per ricevere i dati?
- è sbagliata la query e restituisce un numero spropositato di dati?
- la logica interna del tuo programma richiede ulteriori elaborazioni che
rallentano ulteriormente l'applicazione?
(ho fatto qualche ipotesi a caso, non è necessaria una risposta)
Sei sicuro che un thread può risolvere il tuo problema?
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Dove puo' essere l'errore?
Prima di entrare nel merito della problematica, suggerisco comunque di 
tentare una sessione di debugging, magari con esecuzione passo per passo 
del codice, per vedere se il problema è individuabile già dal punto di 
vista logico analizzando la sequenza delle operazioni che vengono 
eseguite in determinate condizioni.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 del codice
...infatti c'erano errori.
ho inoltre modificato il dialogo in modo che sia "stayontop".
adesso sembra funzionare.
JH