sapete indicarmi link dove posso trovare qualcosa (concetti, sintassi ed esempi..) sul multithreading??
ciao!
sapete indicarmi link dove posso trovare qualcosa (concetti, sintassi ed esempi..) sul multithreading??
ciao!
ciao a tutti
se avete tempo e voglia (chissa' quanta ne avrete dopo aver letto le prime venti righe di questa discussione..) di pensare a una soluzione che mi possa aiutare, questo e' il mio problema: ho capito cosa sono i thread e (forse) come farli.. pero':
ho due thread:
- il primo legge quello che passa nella scheda audio e lo memorizza in un'area di memoria
- il secondo, in contemporanea (anzi: in leggera differita..), legge quell'area di memoria ed elabora un risultato (cioe' la stringa di bit che identifica quel pezzo di canzone)
il mio programma funziona in un modo del genere: http://fisicavolta.unipv.it/percorsi/txt/testo.txt
problema: tutto deve funzionare in real time, percio' l'area di memoria dove vengono immagazzinati i campioni letti dalla scheda audio cresce sempre..
altro problema: il thread che legge quanto deve leggere??
io ho pensato una soluzione del genere:
M] nel main faccio partire entrambi i thread
1] il thread 1 legge 512 campioni e li mette in un array
2] il secondo per adesso non fa nulla
1] il thread 1 legge altri 512 e li mette in un secondo array
2] il 2 non fa ancora nulla
1] 1 legge ancora 512 e li mette nell'array 3
...
quando i campioni letti in totale sono 16384
1] 1 legge altri 512 e li mette nell'array 33 [=(16384+512)/512]
2] 2 ha ora a disposizione 16896 [=16384+512=(512x32)+512=512x33] campioni, mette gli array nell'ordine giusto (ed e' facile visto che sono in sequenza) e puo' iniziare ad elaborare il risultato H1
1] nel frattempo (visto che l'elaborazione di H1 e' lenta..) 1 ha gia' letto altri 512 campioni e li ha memorizzati nell'array 34.. o magari ne ha gia' letti 1024 percio' ha riempito anche l'array 35..
2] 2 prima di iniziare l'elaborazione di H2 cancella l'array 1 e in qualche modo lo deve dire al thread 1.. poi legge l'array successivo all'ultimo letto (legge il 34 e accoda questi campioni a quelli che ha gia' in memoria) ed inizia ad elaborare h2
1] 1 legge altri 512 campioni, vede che l'array 1 e' stato svuotato e ce li mette li' dentro dicendo in qualche modo al thread 2 che i campioni successivi a quelli presenti nell'array 35 li trova nell'array 1..
2] 2 finisce di elaborare H2
1] 1 legge altri 512 campioni e li mette nel primo array libero (che in questo esempio e' il 36) e dice al thread 2 che i campioni successivi a quelli dell'array 1 sono nel 36..
2] 2 cancella l'array 2 che non gli serve piu'
...
ODDIO!!
a parte la difficolta' della spiegazione e soprattutto a quella che sara' la realizzazzione di queste idee.. e' una cosa intelligente?? o vi viene in mente qualcosa di un po' piu' semplice e furbo??
tutto per non sprecare memoria e non continuare a leggere gli stessi dati (visto che c'e' parecchia sovrapposizione per l'elaborazione: ogni elaborazione ha solo 512 campioni diversi rispetto all'elaborazione precedente..) piu' volte (per questo ho pensato di non leggere piu' di 512 campioni per volta..)
ogni suggerimento o idea e' ben gradito e tanto apprezzato
ciao e grazie
PS: se puo' essere d'aiuto
http://fisicavolta.unipv.it/percorsi/paths/tab.html
(funziona piu' o meno cosi' a parte i tempi di elaborazione che solo per semplicita' nella tabella sono il doppio dei tempi di lettura dei 512 campioni..)
ciao a tutti
ho iniziato a cimentarmi con i thread e gia' all'inizio ho dei problemi..
ho un bottone:
void CHasDlg::OnButtonGetsamples()
{
_beginthread( waveIn.record_frame(), 0, NULL );
}
dove:
class CWaveIn
{
public:
void record_frame();
...
};
e:
void CWaveIn::record_frame()
{
...
}
l'errore che mi da e':
Compiling...
hasDlg.cpp
...
error C2664: '_beginthread' : cannot convert parameter 1 from 'void' to 'void (__cdecl *)(void *)'
Expressions of type void cannot be converted to other types
Error executing cl.exe.
..cosa sbaglio??
grazie e ciao