ciao ho provato a fare come dici te, e cioè a usare i thread (non sapevo che si potesse fare una cosa del genere). Alla fine ho fatto così: ho creato un thread con il compito di ascoltare i dati provenienti da una porta e man mano che riceve i dati, a seconda dei valori che riceve deve muovere delle picturebox sulla form. Solo che mi restituisce il seguente errore: "Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'frmGame' da un thread diverso da quello da cui è stata eseguita la creazione."
Da quello che ho capito la modifica degli oggetti grafici (Control) di una form può essere eseguita solo dal thread principale e per ovviare a ciò ho provato a usare dei delegati. Solo che il problema rimane e continua a darmi lo stesso identico errore.
posto il codice:
codice:
delegate void delegaCreaTassello(Point p, int tipo);
delegate void delegaMuovi();
private void creaTassello(Point p, int tipo) <== metodo richiamato tramite delegato
{
tassello tas = new tassello(p, tipo, 0);
tas.Image = img[tipo];
tas.Size = new Size(30, 30);
tas.Location = p;
snake.Add(tas);
this.Controls.Add(tas); <== qui restituisce l'errore (se commento questa riga l'errore viene restituito nel metodo sottostante
System.Diagnostics.Debug.Print("pic aggiunta");
}
private void muovi() <== metodo richiamato tramite delegato
{
foreach (tassello tas in snake)
tas.Location = tas.newPoint; <== errore
}
private void riceviDati()
{
while (true)
{
int num = 0;
string command = leggiFlusso.ReadLine();
if (command.Equals("WALK"))
{
delegaMuovi muoviTas = new delegaMuovi(this.muovi); <== nuova istanza
muoviTas(); <== richiamo il metodo muovi(più sopra) tramite delegato
}
else
{
num = int.Parse(command);
switch (cont)
{
case 0:
p = new Point();
p.X = num;
cont++;
break;
case 1:
p.Y = num;
cont++;
break;
case 2:
this.pos = num;
cont++;
break;
case 3:
if (num <= snake.Count - 1)
{
if (snake[num].pos != this.pos)
{
Bitmap newImg = new Bitmap(img[snake[num].tipo]);
newImg.RotateFlip((RotateFlipType)this.pos);
snake[num].Image = newImg;
snake[num].pos = this.pos;
}
snake[num].newPoint = p;
}
else
{
delegaCreaTassello newTassello = new delegaCreaTassello (this.creaTassello);
if (snake.Count <= 2)
newTassello(p, snake.Count); <== richiamo il metodo creaTassello (più sopra)
else
{
newTassello(p, 2);
snake[snake.Count - 2].Image = img[1];
}
}
cont = 0;
break;
}
}
}
}
help please
ciao e grazie
luca