2011-12-02 14 views
5

Ho un'applicazione Delphi 6 che utilizza la suite di componenti ICS per effettuare comunicazioni socket. Ho il mio componente VCL per il socket del server che crea i socket TWSocket client quando diventa disponibile una nuova sessione. I socket client che creo hanno la proprietà Multithread impostata su TRUE, ma tutto ciò che cambia è il modo in cui il socket client gestisce i messaggi socket in modo sicuro da un thread in background (thread VCL non principale). TWSocket non genera un thread per gestire il traffico di dati del socket, che è quello di cui ho bisogno.Come posso inviare un evento OnDataAvailable() di TWSocket a un thread in background nell'applicazione Delphi 6?

È necessario che le chiamate di ricezione si verifichino dal thread VCL principale, il thread dell'interfaccia utente principale, poiché i dati in ingresso sul socket client sono dati audio che devono essere elaborati rapidamente, in 50-100 millisecondi o meno. In altre parole, un singhiozzo sul thread VCL principale e il flusso audio viene interrotto. Questo è il motivo per cui voglio spingere l'evento OnDataAvailable() che si attiva ogni volta che i dati in entrata sono disponibili su un thread in background con priorità alta. In altre parole, voglio forzare il ciclo di elaborazione dei messaggi che appartiene all'oggetto TWSocket del client a un thread in background.

Credo di poterlo fare creando il socket client tramite un thread in background, ma spero di evitarlo visto che al momento utilizzo un componente VCL creato che funge da socket server. Questa è l'entità che accetta la connessione in ingresso e genera i socket client. Il server socket è stato creato sul thread VCL principale.

Quindi la mia domanda è: esiste un modo relativamente facile per creare i socket client in modo che utilizzino un thread in background esistente per eseguire l'elaborazione del socket, in particolare la gestione dei messaggi FD_RECV? Se non è un thread in background esistente, ne creerò uno per ogni socket client che creo, ma ho bisogno di sapere come assicurarmi che il nuovo oggetto TWSocket usi quel thread in background quando esegue il suo loop di messaggi che elabora i messaggi socket, quindi come sarebbe Lo faccio?

+2

Dev'essere ICS? Indy e Synapse sono molto facili da usare con i thread e non dipendono dal "collo di bottiglia" della coda degli eventi di Windows. – mjn

+0

@mjn. Puoi approfondire "il collo di bottiglia della coda degli eventi"? Cosa fanno Indy/Synapse in modo diverso quando si tratta di processare i messaggi socket O/S che lo circondano? –

+2

@RobertOschler: Indy non usa affatto i messaggi socket. Tutte le prese sono utilizzate in modalità di blocco. ICS utilizza invece socket non bloccanti. –

risposta

3

Per gli altri utenti ICS/TWSocket, la soluzione è nel progetto dimostrativo ICS ThrdSrv fornito con il pacchetto. Osserva attentamente il progetto, in particolare l'uso dei metodi ThreadAttach() e ThreadDetach(). Quel progetto di esempio mostra come creare socket client che hanno pump di messaggi che vengono eseguiti nel contesto di un thread di lavoro.

Problemi correlati