Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 27-07-2004, 20.45.15   #301
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Cominciamo dall'inizio:

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;
	}
Perchè mi scriva che sono ammesse solo 2 istanze, devono essere presenti entrambi i semafori ed entrambi !=NULL

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");
poi...

Codice:
sem[1] = CreateSemaphore(NULL,0,1,"semaforo2");
if(sem[1] == INVALID_HANDLE_VALUE)
			Errore_("Errore nella creazione del semaforo 2");
Aspetta un po...creo semaforo2 ?
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;
	}
sem[0] e sem[1] non sono entrambi !=NULL.

La soluzione è in allegato.
LoryOne non è collegato   Rispondi citando
Vecchio 27-07-2004, 20.46.39   #302
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Ho visto solo ora che dovevo aspettare e forse avevi risolto.
LoryOne non è collegato   Rispondi citando
Vecchio 27-07-2004, 21.10.59   #303
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da LoryOne
Ho visto solo ora che dovevo aspettare e forse avevi risolto.
Non mi ero accorto di dover creare sem[1] nella seconda istanza perché non stavo dando peso al controllo che mi inibisce il lancio di più di 2 istanze (non partivano altre istanze, ma non usciva il messaggio d'avviso), mi stavo proponendo di rivederlo in seguito, quando invece era proprio quello l'input per sistemare le cose.
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.
Alhazred non è collegato   Rispondi citando
Vecchio 28-07-2004, 11.50.28   #304
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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");
se invece al posto del secondo 0 metto ad esempio 1024, la seconda istansza riesce ad aprire la memoria condivisa.
Perché questo, non posso mettere entrambi i puntatori all'inizio dell'area di memoria in questione?
Alhazred non è collegato   Rispondi citando
Vecchio 28-07-2004, 12.40.56   #305
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da P8257 WebMaster
Scusate, mi sono perso qualche post...

Nel controllo del timestamp devi aspettarti di ricevere dall'alra istanza un valore maggiore rispetto a quello che tu, come istanza attiva, avevi inserito la scorsa volta .. inoltre questo ti aiuta anche nel capire se l'altra istanza per qualsiasi motivo dovesse mancare di risponderti .. oppure per poter impostare un valore limite o un timeout ...
...
Se uso il timestamp non formattato, posso comunque specificare di quanto deve essere maggiore il seguente? Come?

...
time_t tempo1, tempo2;

time(&tempo1);
tempo2 = tempo1 + 5;
...

E' una cosa valida? Se sì, il 5 sarebbero sec, msec o cos'altro?
Alhazred non è collegato   Rispondi citando
Vecchio 28-07-2004, 15.20.14   #306
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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.
LoryOne non è collegato   Rispondi citando
Vecchio 28-07-2004, 17.57.21   #307
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da LoryOne
...
Non riesco a capire l'utilizzo del timestamp
Magari sto sbarellando.
In effetti mi resta anche difficile applicare il controllo, perché:
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.
Alhazred non è collegato   Rispondi citando
Vecchio 29-07-2004, 19.55.54   #308
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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é?
Alhazred non è collegato   Rispondi citando
Vecchio 29-07-2004, 20.35.40   #309
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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.
LoryOne non è collegato   Rispondi citando
Vecchio 29-07-2004, 22.07.07   #310
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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);
}
Esce sempre questa sequenza:
2
2
1
1
2
1
1
1
Alhazred non è collegato   Rispondi citando
Vecchio 29-07-2004, 22.11.13   #311
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Quota:
Originariamente inviato da Alhazred
Il problema è dell'istruzione che genera il numero casuale,
Prima di chiamare la funziona rand() devi chiamare la randomize() che genera il "seme" su cui poi si basa la rand(). Non so darti dettagli maggiori perchè i miei ricordi di C sono abbastanza arruginiti

Ciao
Dav82 non è collegato   Rispondi citando
Vecchio 29-07-2004, 22.14.40   #312
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Quota:
Originariamente inviato da Dav82


Prima di chiamare la funziona rand() devi chiamare la randomize() che genera il "seme" su cui poi si basa la rand(). Non so darti dettagli maggiori perchè i miei ricordi di C sono abbastanza arruginiti

Ciao
Grazie per l'input, ora mi guardo l'MSDN
Alhazred non è collegato   Rispondi citando
Vecchio 29-07-2004, 22.28.16   #313
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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);
}
Mancava questo:
void srand( unsigned int seed );

Adesso i numeri generati sono davvero casuali.
Grazie ancora
Alhazred non è collegato   Rispondi citando
Vecchio 29-07-2004, 22.39.12   #314
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Quota:
Originariamente inviato da Alhazred
Grazie Dav, ho risolto così:

Mancava questo:
void srand( unsigned int seed )

Grazie ancora
Di nulla

Erano proprio arruginite... forse randomize è in Pascal... vabbè, l'importante è che adesso sia a posto!
Dav82 non è collegato   Rispondi citando
Vecchio 29-07-2004, 22.51.01   #315
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
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'.
Alhazred non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
La grande battaglia dei super eroi! Sbavi Chiacchiere in libertà 83 27-02-2009 11.43.39
battaglia navale in c# Joy&Lu Programmazione 3 01-09-2008 16.08.58
Il Signore degli Anelli - La Battaglia per la terra di mezzo Darth Maul Masterizzazione Giochi Games 0 01-09-2006 19.16.18
[C] Battaglia Navale (versione client server) in Linux Nanri Programmazione 11 06-08-2005 15.50.27

Orario GMT +2. Ora sono le: 13.10.59.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.