Newsgroup: it.comp.lang.delphi
Titolo: 2 procedure che lavorano in parallelo

ciao a tutti, dovrei riuscire a lanciare 2 procedure che lavorano in
parallelo, cosa consigliate??? io pensavo thread ma non li ho mai usati
Simone

io pensavo thread ma non li ho mai usati
Pensavi bene, caro Simone, e qui puoi trovare un ottimo tutorial sui threads
scritto dal mitico MSX:
http://groups.google.it/groups?&selm=7Wypa.49532%24LB6.1117768%40news1.tin.it
Ciao
-- 
ICLD - Morde. 
(delphi day 2003 ticket)

 parallelo, cosa consigliate??? io pensavo thread ma non li ho mai usati
Devi usare i Thread.
Da Delphi ci puoi accedere in due modi, il primo è la classe TThread messa a
disposizione da VCL, il secondo è l' accesso diretto alle funzioni Win32
(CreateThread() ed affini).
Per quanto mi riguarda per piccole procedure non scomodo la VCL, mi scrivo
le due chiamatine a mano. Per altri tipi di progetti credo che TThread sia
davvero comoda.
--
- Carlo -

allora vorrei esporre il problema:
ho una procedura che invia sms a due "gateway" diversi che ora chiamo GATE A
e GATE B, attualmente vengono eseguite 2 procedure, una per il gate A e al
suo termine quella per il Gate b. ovviamente un utilizzo di questo genere mi
porta un consumo di tempo, in quanto per grossi quantitativi di sms devo
attendere che il primo abbia finito. Le operazioni che le 2 procedure fanno
sono di richiamo url con alcuni parametri e un post tramite tabella mysql
(usando gli zeos dataset) per scrivere una sorta di log. Pensate che valga
la pena iniziare a studiare i thread???
Simo
"Carlo Bertuccini" <cber...@DOHlibero.it> ha scritto nel messaggio
news:Gy0Ga.21544$Fr5.4...@tornado.fastwebnet.it...


 ha scritto nel messaggio
news:me3hevou2q71jj3ud...@4ax.com...


 Pensate che valga la pena iniziare a studiare i thread???
Se le due procedure non effettuano accessi concorrenti a dati condivisi non
c'è molto da capire ne da studiare.
Tu devi solo vedere i Thread come unità base dei processi Win32; ogni
processo ha almeno uno (main thread) o più threads.
I threads vengono gestiti dalla CPU con i time slice ed all'apparenza sono
eseguiti in contemporanea.
Ecco un piccolo esempio preso da un mio vecchio post:
Procedure TForm1.Button1Click(Sender: TObject);
var tid: dWord;
begin
  hThread := CreateThread(nil,0,@StartThread,nil,CREATE_SUSPENDED,tid);
  SetThreadPriority(hThread, REALTIME_PRIORITY_CLASS)
  ResumeThread(hThread)
end;
La funziona CreateThread crea il thread, i parametri importanti sono il
puntatore alla funzione che contiene il codice da eseguire (StartThread nel
nostro caso) e la modalità di creazione (in questo caso CREATE_SUSPENDED,
ovvero crea il thread e mettilo in pausa). Questa ritorna un handle al
Thread che verrà usato per le operazioni sul thread. Per gli altri parametri
ti rimando alla documentazione. Segue una chiamata a SetThreadPriority(),
generalmente i thread vengono creati con priorità normale
(NORMAL_PRIORITY_CLASS) ed in questo caso ho aumentato la priorità perchè
desideravo che il thread disponesse di maggior cpu-time rispetto agli altri
thread del processo. Subito dopo c'è la ResumeThread() che risveglia il
thread se in modalità sospesa. La SuspendThread() sospende il thread se è in
modalità running. La procedura StartThread deve seguire un prototipo
(specificato sempre sulla documentazione Win32) e la procedura qui sotto
rispetta quel prototipo.
function StartThread( par: Pointer ): dWord; stdcall;
begin
        // codice
end;
Se il tuo thread deve restare in memoria per effettuare dei controlli puoi
inserire nel codice della procedura un ciclo con condizione di uscita.
Buon lavoro
--
- Carlo -

 qualche cosa
prova a dare un'occhiatat anche a questo link. E' davvero molto valido.
http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
ciao
Antonio

 ha scritto nel messaggio
news:GK%Fa.80377$pR3.1...@news1.tin.it...


 query distinte??
Beh, se la query è unica mi viene in mente che il parallelismo potrebbe
esser sfruttato in maniera minimale se non nullo.
Per evitare accessi concorrenti bisogna garantire la mutua esclusione dell'
oggetto al quale si accede; per far ciò esistono diversi approcci. Uno dei
più seguiti è quello di utilizzare "variabili speciali" come mutex o
semafori che garantiscono la mutua esclusione. Questo genere di variabili
speciali sono oggetti Kernel del sistema operativo per cui possono essere
tranquillamente utilizzate internamente ai processi Win32. Mutex e Semafori
sono solo uno dei tanti approcci disponibili.
Fai attenzione, in contesti come questo il parallelismo può trarre in
inganno.
Se ogni thread acquisisce l'oggetto query tramite un mutex, ad esempio, e lo
rilascia solo al termine della sua esecuzione allora il parallelismonon
serve a nulla in quanto i thread resterebbero in waiting sull' unico thread
running e comunque risulterebbe sempre un solo thread in running. Per
sfruttare il parallelismo in contesti come questo è necessario che il tuo
thread memorizzi in locale le informazioni che gli servono, rilasci la
risorsa in modo da renderla disponibile ad altri threads, esegua il codice
per cui è stato predisposto. Poi sta a te valutare se queste operazioni "in
più" non ti facciano comunque perdere i vantaggi del multi-threading; molto
dipende anche da quanto il codice del thread impegni la cpu e da quanto il
refresh della query sia veloce.


 piů" non ti facciano comunque perdere i vantaggi del multi-threading;


 ne dite??
Ue'! Stai provando i threads sul mio cellulare?!? :-))
maz

 ha scritto nel messaggio
news:bccejl$hkqtp$1...@ID-194014.news.dfncis.de...
