PDA

Visualizza la versione completa : [c++] multithread


raphi01
30-10-2003, 16:17
sapete indicarmi link dove posso trovare qualcosa (concetti, sintassi ed esempi..) sul multithreading??
ciao!

raphi01
31-10-2003, 18:31
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..)

raphi01
03-11-2003, 13:20
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

Loading