Newsgroup: it.comp.lang.delphi
Titolo: thread, risolto a meta'

Ciao a tutti!
Dopo qualche sudata sono riuscito a far funzionare il codice per fare una
specie di sveglia in un programma qualsiasi.
Pero'... c'e' sempre un pero'...
Per come la ho scritta, all'ora desiderata c'e' un popup che mostra un
messaggio che l'utente aveva impostato.
Tutto funziona bene se l'utente in quel momento ha il focus  sulla mia
applicazione.
Se pero' l'utente sta facendo qualcos'altro, per esmpio scrivendo qualche
ocsa n word, il messaggio non compare nemmeno.
Mi piacerebbe che l'utente ricevesse il messaggio in qualsiasi applicazione
si trovi.
Sapete dirmi come si puo' fare?
Ecco il codice:
come chiamo il nuovo thread:
procedure Tmainform.provaExecute(Sender: TObject);
var new:ttimethread;
begin
if settimer.showmodal = mrok then
new:=ttimethread.create(settimer.dtp.time,settimer.lemessaggio.text);
end;
allora:
settimer e' una form che ha un datetimepicker che si chiama dtp e un editbox
che si chiama lemessaggio. Da qui prelevo i dati da passare al nuovo thread.
Ecco la unit del thread:
unit timethread;
interface
uses
sysutils,Classes,dialogs,dateutils,shellapi;
type
  ttimethread = class(TThread)
  private
function comparetimes(t1,t2:tdatetime):boolean;
    { Private declarations }
  protected
    procedure Execute; override;
public
constructor create(time:tdatetime; msg:string);
procedure allarme;
procedure inizio;
  end;
implementation
var
mytime:tdatetime;
messaggio:string;
{ ttimethread }
constructor ttimethread.create(time:tdatetime; msg:string);
begin
mytime:=time;
messaggio:=msg;
  inherited create(false);
end;
procedure ttimethread.allarme;
begin
showmessage(messaggio);
end;
function ttimethread.comparetimes(t1,t2:tdatetime):boolean;
var s1,s2:string;
begin
comparetimes:=false;
s1:=timetostr(t1);
s2:=timetostr(t2);
delete(s1,6,100);
delete(s2,6,100);
if s1=s2 then
comparetimes:=true;
end;
procedure ttimethread.inizio;
begin
showmessage('entrato');
end;
procedure ttimethread.Execute;
begin
freeonterminate:=true;
priority:=tplowest;
synchronize(inizio);
                  while not comparetimes(now,mytime) do
begin
if terminated then exit;
end;
synchronize(allarme);
              { Place thread code here }
end;
Ho riscritto la funzione comparetimes perche' voglio che confronti solo
l'ora e i minuti e non mi interessa dei secondi...
Forse cosi' come sta non e' ottimizzata visto che verra' eseguita un numero
enorme di volte... ma non so fare di meglio... se avete suggerimenti...
La priorita' la ho messa a tplowest, potrei usare anche tpidle?
Secondo voi dovrei impostare anche un controllo su quanti thread apre
l'utente?
quanti potrebbe sopportarne un computer senza compromettere il buon
andamento del s.o. e degli altri programmi?
Grazie per la vostra pazienza.
Andrea

)

Ciao!
Ci ho provato ma non sembra funzionare...
Forse dovrei chiamare il metodo application.bringtofront, potrebbe essere
una soluzione?
Se si, come faccio a chiamarlo da una unit che contiene solo l'oggetto
thread?
ho provato semplicemente con applicazion.bringtofront ma mi dice che non
esiste application...
Come faccio a riferirmi all'oggeto application della form principale?
Grazie
Andrea
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:1Pd5c.56415$O31.2...@news4.tin.it...


 Come faccio a riferirmi all'oggeto application della form principale?
Aggiungi la unit Forms alla clausola "uses" della unit che contiene la
definizione del thread e prova ad aggiungere una chiamata ad
Application.BringToFront inglobando la chiamata del metodo all'interno
di Synchronize.
Un esempio a puro titolo indicativo (non verificato):
===
procedure TMyThread.Execute;
begin
  Synchronize(Application.BringToFront);
end;
===
Ciao!
P.S.: scusa per il ritardo nella risposta ma mi era sfuggito il tuo
reply al mio messaggio. ;-)
