Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ciao a tutti ho scritto questo semplice codice per iniziare la programmazione di Thread:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include "mia_libreria.h"
bool esci=false;
unsignedchar x_b=1, y_b=1;
unsignedchar x_t=1, y_t=20;
void spara()
{
unsignedchar i, ausx=x_t;
for(i=y_t-2;i>=1;i--)
{
delay(100);
gotoxy(ausx,i+1);
putchar(' ');
gotoxy(ausx,i);
putchar('*');
}
if(x_b==ausx)
{
gotoxy(0,0);
printf("Hai vinto!");
esci=true;
}
else
{
gotoxy(ausx,i);
putchar(' ');
}
chiudi_thread();
}
void muovi_x()
{
bool indietro;
while(!esci)
{
delay(100);
if(indietro)
{
gotoxy(x_b,y_b);
putchar(' ');
x_b--;
gotoxy(x_b,y_b);
putchar('x');
}
else
{
gotoxy(x_b,y_b);
putchar(' ');
x_b++;
gotoxy(x_b,y_b);
putchar('x');
}
if(x_b==60)
indietro=true;
elseif(x_b==1)
indietro=false;
}
chiudi_thread();
}
int main()
{
_beginthread(muovi_x,0,NULL);
unsignedchar tasto;
while(!esci)
{
tasto=getch();
if(tasto==27)
esci=true;
elseif(tasto==75)
{
gotoxy(x_t,y_t);
putchar(' ');
x_t--;
gotoxy(x_t,y_t);
putchar('_');
}
elseif(tasto==77)
{
gotoxy(x_t,y_t);
putchar(' ');
x_t++;
gotoxy(x_t,y_t);
putchar('_');
}
elseif(tasto==' ')
{
_beginthread(spara,0,NULL);
}
}
return0;
}
Facendolo girare però ogni tanto viene stampata la 'x' o il trattino sbagliati
e soprattutto quando si sparano più colpi insieme vengono fatte delle stampe
assurde. Il codice mi sembra giusto, cosa posso aver sbagliato?
EDIT:
Scusa anthony015 ma ho premuto per sbaglio INVIO e non riesco a modificare.
Comunque penso di si perchè ogni thread usa variabili diverse.
Forse per iniziare potrei mettere come parametro alla funzione spara la x_t
almeno non devo più assegnarla ad ausx.
Provo poi ti dico.
Grazie comunque per la risposta =)
Ultima modifica effettuata da comina8 il 23/06/2011 alle 12:30
innanzitutto scusa per averti dato del lei, ma il nome mi ha tratto in inganno... comunque x_b è usata sia in spara che muovi, y_t sia in main che in spara e x_t nel main e in spara, ma è molto difficile che su di essa vengano effettuati più accessi simultaneamente - anthony015 - 23/06/11 14:03
Figurati =). Comunque ho provato a passarli come parametri ma niente da fare. A dirti la verità mi sembra che un po' meglio vada però il problema persiste..-.-" - comina8 - 23/06/11 18:50
Ulteriore problema: ogni tanto anche la 'x' o il '_' vengono stampati senza cancellarli o in modo strano quindi dev'essere un problema di gotoxy magari, che passando i parametri ogni tanto li confonde o se ne dimentica qualcuno. Provo a scrivere il codice per intero speriamo si modifichi qualcosa. - comina8 - 23/06/11 18:53
anche gotoxy e putchar dovrebbero fare parte di una sezione critica... - anthony015 - 23/06/11 19:00
La gotoxy l'ho scritta per intero e da sempre lo stesso probleme. Per quanto riguarda la putchar come dovrei fare (comunque sbaglia a stamparmi nelle coordinate non cosa stampa) - comina8 - 23/06/11 19:44
per ogni sezione critica dovresti usare un opportuno algoritmo per la mutua esclusione, http://it.wikipedia.org/wiki/Categoria:Algoritmi_di_mutua_esclusione - anthony015 - 23/06/11 20:22
E ma come posso implementarlo? Cioè devo eseguire un'istruzione alla volta per ogni processo? Anche perché non so qual'è la zona critica quindi piuttosto faccio eseguire in sequenza ogni istruzione bloccando la CPU su un'istruzione alla volta come "voglio io"... - comina8 - 23/06/11 20:43
la sezione critica è http://it.wikipedia.org/wiki/Sezione_critica , in parole povere una parte di un processo che accede a dati condivisi con altri processi, quelli che ti ho linkato prima sono dei possibili algoritmi per garantire che non accada casino quando 2 o più processi(o thread)->segue sotto - anthony015 - 23/06/11 20:58
tentano di accedere contemporaneamente ad una risorsa condivisa, che come puoi ben capire viene a crearsi un bel problema se 2 processi accedono/modificano una variabile allo stesso tempo, per l'implementazione è puoi seguire wikipedia, che mi pare molto chiara... - anthony015 - 23/06/11 21:00