Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    collegare tra di loro due threads

    Salve,

    non ho messo in rilievo il linguaggio perchè ho bisogno più che altro di capire che procedura devo usare per realizzare un progetto software che ho in mente da un pò di tempo (a puro scopo dilettantistico!). Tuttavia è scontato dire che il linguaggio sarà C++ allacciato alle Win32 API.

    Il software in questione vuole essere un semplice streaming server (http) composto da un processo principale (capturing/encoding thread) che catturando l'audio da un device wavein qualunque (built-in mic, missaggio stereo, sorgente esterna etc...) fa la conversione real-time in mp3 (Lame-end DLL) e appunto passa poi il tutto al piccolo server http che servirà clients RealPlayer, iTunes, WinAmp (simulando un header shoutcast/icy) secondo il metodo dell'endless download.

    Sto programmando e mettendo appunto i vari pezzi del programma:

    waveCapture.h
    mp3Encoder.h
    httpServer.h

    più la GUI naturalmente. (ma per adesso il core mi accontento che sia anche solo consolle)

    Il programma si divide in due thread principali: capturing/encoding e server.

    Il problema che per adesso mi blocca è non sapere come passare i dati dal primo thread al secondo. Nel primo thread mi ritrovo ogni secondo con un certo numero di bytes (risultato dell'encoding mp3) pronti per essere passati al server (secondo thread).

    Le soluzioni a cui avevo pensato erano:

    1) il server http è in ascolto su due porte, una locale in UDP dove riceve i dati dal primo thread. La seconda porta è quella pubblica in ascolto in TCP dove smista i pachetti che gli arrivano dal primo thread. Il server http cmq è limitato, massimo 5 connessioni in contemporanea.

    2) Il primo thread ed il server scrivono/leggono su una variabile o una serie di vector<buffer> in comune e magari potrei implementare una callback event. Tuttavia il problema principale é che entrambi i threads non devono essere bloccanti! Non posso aspettare a riempire un buffer con i dati dell'encoding perchè il server li sta ancora leggendo.

    3) aiutatemi voi con qualche lampo di genio!

    Grazie
    Alla batteria dai retta ballA

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    specifica meglio il punto 2

  3. #3
    ho in mente una struttura queue di cui fa parte una struttura buffer che ha vari parametri tipo: char* audiodata, flag = FREE/USED, timestamp timestamp...ma è solo un idea così buttata la...
    Alla batteria dai retta ballA

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Il linguaggio va specificato anche (o soprattutto) nel titolo.

    Aggiunto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ok, dato che il progetto è in C++ posso anche buttare giù un pò di codice:

    codice:
    #include <stdlib.h>
    #include <process.h>
    #include <iostream>
    #include <string>
    #include "socket.h"
    using namespace std;
    
    unsigned __stdcall Answer(void* a)
    {
    	Socket* s = (Socket*) a;
    	while(1)
    	{
    		// Ora il client viene gestito quì, intanto in main() si aspettano altri client
    		string r = s->ReceiveLine();
    		if (r.empty())
    			break;
    
    		cout <<"[Client] " << r << endl;
    
    		s->SendLine("Hello, I am the server!");
    	}
    
    	delete s;
    	return 0;
    }
    
    int main()
    {
    	// Mi metto in ascolto sulla porta 8000 (tcp), MAX CONNECTION 5
    	SocketServer in(8000,5);
    	
    	while(1)
    	{
    		// Aspetto che un client si connetta
    		Socket* s=in.Accept();
    		cout << "a client connected..." << endl;
    		unsigned ret;
    
    		// Quando un client si connette lancio un nuovo thread per gestirlo
    		_beginthreadex(0,0,Answer,(void*) s,0,&ret);
    	}
    	
    	system("pause");
    	return EXIT_SUCCESS;
    }
    Nel main abbiamo il server in ascolto, ad ogni connessione si crea una nuova istanza (thread) che gestirà il client. Intanto in main rimaniamo in ascolto in attesa di altri clients.

    Perciò il punto principale diventa la funzione Answer dove si comunica con il client tramite l'uso di ReceiveLine() e SendLine().

    Ora bisognerebbe allacciarsi con il buffer dove intanto il thread principale (capturing/recording) sta scrivendo...quindi già mi ritrovo davanti ad una scelta nel caso ho molti clients connessi allo stesso momento: 5 istanze che leggono lo stesso buffer oppure il thread principale che scrive su 5 istanze di buffer?

    Alla batteria dai retta ballA

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.