|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
![]() |
#301 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
sem[0] = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo "); sem[1] = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo 1"); Ok, deve controllare che vi siano 2 semafori di nome semaforo e semaforo1 Codice:
if(sem[0] != NULL && sem[1] != NULL) { printf("Sono ammesse solo 2 istanze del programma!\n"); Sleep(1000); return 0; } if(sem[0] == NULL) //se è vera, questa è la prima istanza sem[0] equivale a semaforo siamo nella prima istanza... Codice:
sem[0] = CreateSemaphore(NULL,0,1,"semaforo"); if(sem[0] == INVALID_HANDLE_VALUE) Errore_("Errore nella creazione del semaforo 1"); Codice:
sem[1] = CreateSemaphore(NULL,0,1,"semaforo2"); if(sem[1] == INVALID_HANDLE_VALUE) Errore_("Errore nella creazione del semaforo 2"); Leggo bene ? semaforo2 ? e dov'è che controlla che esista semaforo2 ? e poi... Perchè creo sem[1] nella prima istanza ? sem[1] va creata nella seconda, altrimenti col cacchio che la ennesima mi verifica questo: Codice:
if(sem[0] != NULL && sem[1] != NULL) { printf("Sono ammesse solo 2 istanze del programma!\n"); Sleep(1000); return 0; } La soluzione è in allegato. |
![]() |
![]() |
![]() |
#302 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Ho visto solo ora che dovevo aspettare e forse avevi risolto.
|
![]() |
![]() |
![]() |
#303 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
Con il codice che mi hai proposto di sistemare invece, tutte le istanze successive alla seconda partivano tutte come seconda istanza ed è stato evidente... Grazie ![]() edit: anzi, doumo arigatou gozaimasu, i giapponesi sanno ringraziare meglio di noi chi lo merita. ![]() |
|
![]() |
![]() |
![]() |
#304 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Avevo detto di avere un problema con la memoria condivisa, ovvero la seconda istanza non riusciva ad aprirla. L'istruzione che usavo per crearla dalla prima istanza è questa:
Codice:
mapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0, "shared_mem"); Perché questo, non posso mettere entrambi i puntatori all'inizio dell'area di memoria in questione? |
![]() |
![]() |
![]() |
#305 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
... time_t tempo1, tempo2; time(&tempo1); tempo2 = tempo1 + 5; ... E' una cosa valida? Se sì, il 5 sarebbero sec, msec o cos'altro? |
|
![]() |
![]() |
![]() |
#306 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Correggetemi se sbaglio ma non basta gestire i valori di ritorno delle chiamate alle API stesse per sapere se la chiamata ha avuto successo o meno ?
Le funzioni API ritornano valori (a volte anche strutture) differenti in base agli eventi verificatesi all'interno del codice stesso della funzione. La gestione delle eccezioni è già li dentro. Non riesco a capire l'utilizzo del timestamp ![]() Magari sto sbarellando. |
![]() |
![]() |
![]() |
#307 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
un processo prende un timestamp, lo scrive in memoria condivisa e fa quello che deve fare. In time sharing un altro processo prende un timestamp e lo confronta con quello in memoria condivisa... ma questo può essere diverso anche se il primo processo non ha ancora finito il suo lavoro. Se il timestamp lo metto alla fine, tanto vale che come ultima operazione metto la scrittura dell'ID del processo attualmente in sezione critica e lo faccio solo su questo il controllo, se non trovo un ID diverso da quello del processo che vuole accedere in memoria sono sicuro che l'altro non è ancora arrivato alla fine delle istruzioni. Altro discorso se metto sia l'ID che il timestamp alla fine e a questo punto il timestamp sarebbe utile per gestire un timeout. |
|
![]() |
![]() |
![]() |
#308 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Credo di aver finito
![]() Ho solo una cosa che non va ![]() In PrimaIstanza() c'è una riga che genera un numero casuale "primo" tra 1 e 2, viene scritto in memoria condivisa nel campo riga del t_Mossa, la prima istanza ha una variabile di nome "istanza" che vale 1, la seconda istanza ha la stessa variabile che vale 2. Il numero casuale viene comparato con "istanza" da entrambi i processi e chi ha risposta positiva, ovvero istanza == primo, inizia. Il problema è questo, risulta sempre la seconda istanza come prima a dover fare la mossa, perché? ![]() ![]() |
![]() |
![]() |
![]() |
#309 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Bravo Alh, davvero (Y)
Ho scaricato il codice e l'ho compilato. Funziona. Non appena ho un po di tempo lo guardo meglio e poi ti so dire anche se sono convinto che ci arriverai da solo. ![]() |
![]() |
![]() |
![]() |
#310 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Il problema è dell'istruzione che genera il numero casuale, ho scritto questo programmino:
Codice:
#include <stdio.h> #include <windows.h> int main(){ int primo = 0, i = 0; for(i=0; i<8;i++) { primo = 1 + (rand()%2); printf("Numero casuale: %i\n",primo); } return(0); } 2 2 1 1 2 1 1 1 ![]() |
![]() |
![]() |
![]() |
#311 | |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
![]() |
Quota:
![]() Ciao ![]() |
|
![]() |
![]() |
![]() |
#312 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
![]() |
|
![]() |
![]() |
![]() |
#313 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Grazie Dav, ho risolto così:
Codice:
#include <stdio.h> #include <windows.h> #include <time.h> int main(){ int primo = 0, i = 0; srand((unsigned)time( NULL )); for(i=0; i<8;i++) { primo = (1 + rand()%2); printf("Numero casuale: %i\n",primo); } return(0); } void srand( unsigned int seed ); Adesso i numeri generati sono davvero casuali. Grazie ancora ![]() |
![]() |
![]() |
![]() |
#314 | |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
![]() |
Quota:
![]() Erano proprio arruginite... forse randomize è in Pascal... ![]() ![]() |
|
![]() |
![]() |
![]() |
#315 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Sto facendo qualche prova per vedere se tutto funziona... ovviamente c'è ancora qualche problema, non mi funziona il controllo all'interno di colpo() che dovrebbe avvisare di un colpo già sparato e invece lo accetta comunque... mi ci dedicherò domani mattina, adesso esco un po'.
|
![]() |
![]() |
![]() |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
![]() |
||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
La grande battaglia dei super eroi! | Sbavi | Chiacchiere in libertà | 83 | 27-02-2009 10.43.39 |
battaglia navale in c# | Joy&Lu | Programmazione | 3 | 01-09-2008 15.08.58 |
Il Signore degli Anelli - La Battaglia per la terra di mezzo | Darth Maul | Masterizzazione Giochi Games | 0 | 01-09-2006 18.16.18 |
[C] Battaglia Navale (versione client server) in Linux | Nanri | Programmazione | 11 | 06-08-2005 14.50.27 |