Cominciamo dal più semplice dei due problemi che ho, dove non ci sono timer, eventi, ma del caro codice old style (sono sempre affezionato al C classico);
l'applicazione è questa: ho un dispositivo collegato attraverso la seriale che periodicamente invia un carattere ATTESA_CARATTERE (caso 1); quando il pc legge questo carattere setta la variabile attesaCarattere a 1 se sta a 0 e chiama la funzione di invioMessaggioSeriale (invia un comando da PC a seriale). Quando il dispositivo ha eseguito il comando invia nuovamente il carattere ATTESA_CARATTERE (caso 2). Quindi si verifica sporadicamente l'ipotesi in cui il PC riceve due volte in sequenza ATTESA_CARATTERE per il verificarsi del caso 1 e del caso 2 e chiama due volte in sequenza la funzione, che però mi sembra a prova di errore (sempre con il mio modo di pensare old style).
void inviaMessaggioSeriale()
{
int i = 0;
if (invioI > 0)
{
if (attesaCarattere == 1)
{
while (attesaCarattere == 1 && invioI > 0)
{
if (invioSeriale[0] == FINE_COMANDO)
attesaCarattere = 0;
seriale->Write(invioSeriale, 0, 1);
for (int i = 0; i < invioI; i++)
{
invioSeriale[i] = invioSeriale[i + 1];
}
invioI--;
/*if ( invioI < 0 )
{
MessageBox::Show(ERRORE44 + "_invioI:" + invioI.ToString());
invioI = 0;
}*/
}
}
}
}
il problema è che sporadicamente la variabile invioI riesce in qualche modo ad assumere un valore < 0; non riesco a capire come.
Se riusciamo a capire questo posso passare al secondo problema, che mi inficia il funzionamento del programma
Grazie.
Saluti
edit: dopo la prova di questa notte con solamente il caso 2 attivo a chiamare la funzione, il problema non si è verificato; la cosa mi fa sempe più pensare ad un problema di sincronizzazione; cercando su google non sono riuscito a trovare un buon link che mi spieghi come applicarla, considerate che io non ho ancora mai usato threads o robe del genere.