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