Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [c++] multithread

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    107

    [c++] multithread

    sapete indicarmi link dove posso trovare qualcosa (concetti, sintassi ed esempi..) sul multithreading??
    ciao!

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    107
    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..)

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    107
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.