SimonJ
04-11-2010, 09:33
Salve a tutti, desidererei chiedere il vostro aiuto per questa questione. Sto sviluppando un software di controllo in real-time su Windows CE 6.0.
Esso si compone di diversi thread, in cui uno di questo gestisce la comunicazione di rete. Uso le MessageQueue come metodo d’intercomunicazione tra thread.
Al momento l’applicativo da me sviluppato funziona egregiamente, a parte la comunicazione bidirezionale attraverso la rete. Fino ad ora, nel thread che gestisce la comunicazione, eseguivo il seguente codice, in altre parole ricevevo i comandi da un socket TCP riuscendo a gestire eventuali disconnessioni:
while(1) {
if (stateCommunication)
{
receiveCommand();
}
else
{
waitForConnection();
}
}
All’interno della funzione receiveCommand() richiamavo la recv() e successivamente procedevo all’elaborazione del comando ricevuto. Ora mi ritrovo con il problema che la recv() blocca l’esecuzione del programma fintanto che non arriva un nuovo comando. Al fine di risolvere questo problema ho provato ad inserire le seguenti istruzioni, con l’intenzione di non eseguire la rev() in presenza di un timeout, ma senza alcun risultato.
FD_ZERO(&fdread);
FD_SET(remoteSocket, &fdread);
if (select(NULL,&fdread,NULL,NULL,&timeSelect)>0) {
(…)
}
oltre che a:
FD_ZERO(&fdread);
FD_SET(remoteSocket, &fdread);
if (FD_ISSET(remoteSocket,&fdread)) {
(…)
}
e:
unsigned long socketBlock=1;
(…)
if (ioctlsocket(remoteSocket,FIONBIO,&socketBlock)==0) {
(…)
}
Come potrei risolvere? Avrei pensato alla seguente strategia: ovvero scomporre la ricezione e l’invio di dati in due thread opportunamente accordati dal thread principale di comunicazione, mediante una MessageQueue bidirezionale. Potrebbe essere una strategia vincente, anche al fine di limitare i ritardi tra invio e processo dei comandi, o solamente un inutile spreco di risorse?
Esso si compone di diversi thread, in cui uno di questo gestisce la comunicazione di rete. Uso le MessageQueue come metodo d’intercomunicazione tra thread.
Al momento l’applicativo da me sviluppato funziona egregiamente, a parte la comunicazione bidirezionale attraverso la rete. Fino ad ora, nel thread che gestisce la comunicazione, eseguivo il seguente codice, in altre parole ricevevo i comandi da un socket TCP riuscendo a gestire eventuali disconnessioni:
while(1) {
if (stateCommunication)
{
receiveCommand();
}
else
{
waitForConnection();
}
}
All’interno della funzione receiveCommand() richiamavo la recv() e successivamente procedevo all’elaborazione del comando ricevuto. Ora mi ritrovo con il problema che la recv() blocca l’esecuzione del programma fintanto che non arriva un nuovo comando. Al fine di risolvere questo problema ho provato ad inserire le seguenti istruzioni, con l’intenzione di non eseguire la rev() in presenza di un timeout, ma senza alcun risultato.
FD_ZERO(&fdread);
FD_SET(remoteSocket, &fdread);
if (select(NULL,&fdread,NULL,NULL,&timeSelect)>0) {
(…)
}
oltre che a:
FD_ZERO(&fdread);
FD_SET(remoteSocket, &fdread);
if (FD_ISSET(remoteSocket,&fdread)) {
(…)
}
e:
unsigned long socketBlock=1;
(…)
if (ioctlsocket(remoteSocket,FIONBIO,&socketBlock)==0) {
(…)
}
Come potrei risolvere? Avrei pensato alla seguente strategia: ovvero scomporre la ricezione e l’invio di dati in due thread opportunamente accordati dal thread principale di comunicazione, mediante una MessageQueue bidirezionale. Potrebbe essere una strategia vincente, anche al fine di limitare i ritardi tra invio e processo dei comandi, o solamente un inutile spreco di risorse?