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 23-07-2004, 09.24.53   #256
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ti ringrazio
Alhazred non è collegato   Rispondi citando
Vecchio 23-07-2004, 16.53.52   #257
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Come timestamp puoi usare il numero di secondi del clock del sistema, equivale allo UNIX timestamp, non c'é bisogno di complicarsi la vita ulteriormente...

occorre includere i tipi C e il time.h, oltre che a reimplementare il t_Mossa aggiungendo il campo appropriato.

Codice:
#include <ctype.h>
#include <time.h>

...

typedef struct 
{
   int riga;
   char colonna;
   time_t TimeStmp;
} t_Mossa;

...

t_Mossa t;
time(&t.TimeStmp);
printf("timestamp: %ld", t.TimeStmp);
Il timestamp è ora un camop strutturato di t, alla funzione time() passo l'area di memoria di t.TimeStmp per poter fare in modo che essa la riempia.

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 23-07-2004, 18.03.11   #258
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Scusami, ma non ho ancora capito come fare il controllo col timestamp, nel senso che:
- cosa deve aspettarsi di trovare l'istanza che vuole accedere alla memoria condivisa affinché sia sicura che l'altra abbia finito?
- il tempo di cosa ci sarà scritto in t.TimeStmp?

Altra domanda:
Il processo che crea il semaforo, deve anche aprirlo o come credo una volta che l'ha creato ha automaticamente l'accesso?
Ovvero, posso togliere gli OpenSemaphore(...) dopo i CreateSemaphore(...) giusto?
Codice:
sem[0] = CreateSemaphore(NULL,0,1,"sem1");
if(sem[0] == INVALID_HANDLE_VALUE)
		Errore_("Errore nella creazione del semaforo 1");

sem[0] = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"sem1");
if(sem[0] == INVALID_HANDLE_VALUE)
	Errore_("Errore nell'apertura del semaforo 1");

sem[1] = CreateSemaphore(NULL,0,1,"sem2");
if(sem[1] == INVALID_HANDLE_VALUE)
	Errore_("Errore nella creazione del semaforo 2");

sem[1] = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"sem2");
if(sem[1] == INVALID_HANDLE_VALUE)
	Errore_("Errore nell'apertura del semaforo 2");

mapping = OpenFileMapping(FILE_MAP_WRITE,FALSE,"shared_mem");
if(mapping == INVALID_HANDLE_VALUE)
	Errore_("Errore nell'apertura della memoria condivisa");

WaitForSingleObject(sem[0],INFINITE);//attende il rilascio da parte della 2°
				//istanza per sapere quando è attiva

PrimaIstanza(sem[2], mapping, my_id);
perché compilando mi dice
warning C4700: local variable 'sem' used without having been initialized
su PrimaIstanza(sem[2], mapping, my_id);?
C'è bisogno di inizializzarli i semafori? Non basta l'assegnazione dei token quando li creo?
Tra l'altro il warning è apparso da quando ho aggiunto [0] e [1] dopo i sem negli if.

Ultima modifica di Alhazred : 23-07-2004 alle ore 18.10.16
Alhazred non è collegato   Rispondi citando
Vecchio 23-07-2004, 19.30.16   #259
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Quota:
Il processo che crea il semaforo, deve anche aprirlo o come credo una volta che l'ha creato ha automaticamente l'accesso?
Non mi risulta.
Una volta creato DEVI aprirlo per poter poi utilizzare WaitForSingleObject oppure WaitForMultipleObject.

La procedura corretta per gestire semafori e/o mutex è la seguente:
1) Creare il semaforo/mutex
2) Aprirlo
3) Attendere il rilascio
4) Chiudere l'handle quando non serve più.

Per quanto riguarda la seconda domanda, cioè l'errore, mi sono perso qualche post. Mi sembra corretto i codice.
Il problema è sicuramente a monte.
LoryOne non è collegato   Rispondi citando
Vecchio 24-07-2004, 16.53.52   #260
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ho provato a togliere gli [1] e [0] negli if e si compila senza warning e senza errori, se li rimetto riappare il warning allo stesso punto.
Questo è il codice aggiornato:
Alhazred non è collegato   Rispondi citando
Vecchio 25-07-2004, 19.12.01   #261
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
"Risolvi" così:
void PrimaIstanza(HANDLE *[], HANDLE, long);
void SecondaIstanza(HANDLE *[], HANDLE, long);

Ora dai un'occhiata a questo esempio:
Codice:
#include <stdio.h>
#include <conio.h>

int pippo[2]={1,2};

void pluto(int *,int);

void pluto(int *boh,int n){
   printf("%i",boh[n]);
   getch();
}
   
main(void){
   pluto(pippo,0);
}
Strano eh ?
Io dichiaro un array di nome pippo di 2 elementi.
Il prototipo pluto vuole come primo parametro un puntatore ad un intero e come secondo un intero.
Poi per visualizzare il contenuto di pippo[n] utilizza un printf("%i",boh[n]).
boh[n] da dove cavolo è uscito ?
La risposta è semplice:

Qualsiasi puntatore può essere indicizzato usando [] come se fosse un array e questo significa che il codice contenuto nella funzione opera sul contenuto dell'array utilizzato per richiamarla, riservandosi persino la possibilità di modificarne il contenuto.
L'array è infatti passato by reference.

Nell'esempio, *boh è un puntatore al primo elemento di pippo[] ed n l' ennesimo elemento.
La chiamata a pluto(pippo,0) visualizzerà 1
La chiamata a pluto(pippo,1) visualizzerà 2.
LoryOne non è collegato   Rispondi citando
Vecchio 25-07-2004, 21.23.07   #262
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ho provato, il warning c'è ancora
Alhazred non è collegato   Rispondi citando
Vecchio 26-07-2004, 08.26.50   #263
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
...allora prova così:
void PrimaIstanza(HANDLE *sem[2], HANDLE, long);
void SecondaIstanza(HANDLE *sem[2], HANDLE, long);
LoryOne non è collegato   Rispondi citando
Vecchio 26-07-2004, 09.19.30   #264
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
LoryOne ha scritto:
Qualsiasi puntatore può essere indicizzato usando [] come se fosse un array e questo significa che il codice contenuto nella funzione opera sul contenuto dell'array utilizzato per richiamarla, riservandosi persino la possibilità di modificarne il contenuto.
L'array è infatti passato by reference.
Esattamente,
questo avviene perché in realtà viene creata un'array stessa di puntatori, uno per ogni elemento ...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 26-07-2004, 09.20.04   #265
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Aspetta, aspetta, ho visto qualcosa che non mi piace in SecondaIstanza
e cioè:

ReleaseSemaphore(sem,1,&dummy)

sem cos'è ?

Guarda, devi rifarti all'esempio che ti ho fatto prima ed in base a quello correggi così:

I prototipi:
void PrimaIstanza(HANDLE *, HANDLE, long);
void SecondaIstanza(HANDLE *, HANDLE, long);
Vanno benissimo (Y)

PrimaIstanza:
Codice:
void PrimaIstanza(HANDLE *s, HANDLE mapping, long my_id) {
	int primo, istanza = 1;
	BOOL inizia = FALSE;
	long dummy;
	t_Mossa *p;

	p = (t_Mossa *)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0);
	if(p == NULL)
		Errore_("\"PrimaIstanza\" non può attaccare la memoria condivisa");

	PosizionaNavi();
	primo = 1 + (rand()%2); //genera un numero casuale per decidere chi inizia

	p->riga = primo;
			
	if(primo == istanza)
		inizia = TRUE;
			
	ReleaseSemaphore(s[0],1,&dummy);
}
SecondaIstanza:
Codice:
void SecondaIstanza(HANDLE *s, HANDLE mapping, long my_id) {
	int primo, istanza = 2;
	BOOL inizia = FALSE;
	long dummy;
	t_Mossa *p;

	p = (t_Mossa *)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0);
	if(p == NULL)
		Errore_("\"SecondaIstanza\" non può attaccare la memoria condivisa");

	PosizionaNavi();

	WaitForSingleObject(s[1],INFINITE);

	primo = p->riga;

	if(primo == istanza)
		inizia = TRUE;
	ReleaseSemaphore(s[1],1,&dummy); //Presumo 
}
Poi richiama le 2 istanze così:
PrimaIstanza(sem, mapping, my_id)
SecondaIstanza(sem, mapping, my_id)

Ultima modifica di LoryOne : 26-07-2004 alle ore 09.28.11
LoryOne non è collegato   Rispondi citando
Vecchio 26-07-2004, 09.36.42   #266
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Si, forse ha fatto quell'errore per "colpa" mia, ... vado a verificare di non aver detto una cag@ta..

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 26-07-2004, 09.56.00   #267
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ho provato come ha detto lory, il warning si è spostato sul primo WaitForSingleObject(sem[1], INFINITE) nell'else del main.
Alhazred non è collegato   Rispondi citando
Vecchio 26-07-2004, 10.05.26   #268
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.503
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Prima di utilizzare WaitForSingleObject cosa devi fare ?
LoryOne non è collegato   Rispondi citando
Vecchio 26-07-2004, 10.07.25   #269
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Niente, quel WaitForSingleObject serve ad attendere che la prima istanza rilasci il semaforo per essere sicuri che semafori e memoria condivisa siano stati creati.
Alhazred non è collegato   Rispondi citando
Vecchio 26-07-2004, 10.15.27   #270
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Torno tra una mezz'oretta, mi si è rotto il gommino di sostegno della marmitta e vado a farmelo cambiare
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 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

Orario GMT +2. Ora sono le: 12.16.47.


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.