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 16-07-2004, 18.55.11   #196
NS-1
Hero Member
 
L'avatar di NS-1
 
Registrato: 09-05-2002
Loc.: COMO
Messaggi: 1.135
NS-1 promette bene
Alh, cattivo
___________________________________

...ad ogni alba sorgerà il tuo profumo
NS-1 non è collegato   Rispondi citando
Vecchio 17-07-2004, 14.15.06   #197
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ecco come ho pensato di gestire il gioco:
Codice:
1 - Dopo aver posizionato le navi entrambi i processi si mettono in attesa
    (semaforo occupato)
2 - si sorteggia chi inizia
3 - il processo non sorteggiato (P2) resta in attesa che in memoria
    condivisa ci sia la coordinata fornita dall'altro processo
    (P1) (come faccio a rilasciare il semaforo ed essere sicuro che
    lo occuperà proprio P1?)
4 - si comunica a P1 di iniziare (semaforo libero per P1)
5 - P1 chiede al proprio utente di inserire una coordinata
6 - P1 accetta la mossa controllando che sia valida e la scrive
    in memoria condivisa (P1 rilascia il semaforo in favore di P2)
7 - si comunica a P2 che il dato che cerca è pronto (semaforo libero per P2)
8 - P2 cerca una corrispondenza tra le coordinate inserite dal suo utente
    all'inizio, se tale corrispondenza esiste o no
9 - nel caso esiste, P2, decrementa il numero di navi non colpite e controlla
    quante ne restano
10 - se le navi rimanenti sono + di 0 comuinca in memoria condivisa che una nave
     è stata colpita rilasciando poi il semaforo in favore di P1
11 - se le navi rimanenti sono 0 comunica in memoria condivisa che ha perso
     rilasciando poi il semaforo in favore di P1
12 - P1 occupa il semaforo, elabora il risultato fornito da P2 e fa apparire un
     simbolo corrispondente all'esito della mossa sulla griglia del proprio
     utente oppure comunica la vittoria, rilascia il semaforo e attende
     la mossa di P2
13 - si ripetono i passi da 4 a 12 invertendo P1 con P2 e così via finché
     qualcuno ha vinto.
com'è la traccia?

Ultima modifica di Alhazred : 17-07-2004 alle ore 14.22.56
Alhazred non è collegato   Rispondi citando
Vecchio 17-07-2004, 14.33.21   #198
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
Alhazred ha scritto:
(come faccio a rilasciare il semaforo ed essere sicuro che lo occuperà proprio P1?)
Devi utilizzare una struttura di controllo... anche semplice .. suggerisco di "infilare" nell'area condivisa, un indicatore che si porti dietro l'id di entrambi i processi in esecuzione..

P1 mettera il suo al momento dell'inizializzazione, P2 il suo al momento del lancio...

Per il resto, mi sembra corretta come macro analisi, scomponendo il problema in step ancora più piccoli ed accurati, ci si potrà rendere conto se vengono a galla potenziali altri step minori...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 17-07-2004, 15.02.14   #199
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Ho appena scoperto che l'if(argc == 1) non mi è utile per capire se è la prima o la seconda volta che lancio il programma.
Ho fatto la prova facendo stampare il valore di argc e in tutti e due i casi era pari a 1.
Come faccio a capire se già c'è un'istanza dello stesso programma in esecuzione?
Alhazred non è collegato   Rispondi citando
Vecchio 17-07-2004, 15.21.37   #200
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Ovviamente, argc è il contatore dell'array dei parametri di linea di comando, il primo elemento contiene il nome del processo stesso:

argv[0]

Per capire se c'é un altro processo in memoria potresti guardare direttamente la memoria condivisa o provare a crearla oppure utilizzare API che ti restituiscano il nome dei processi ....

Consiglio la creazione di un mini-loader (anche un batch va bene) che si occupi di lanciare le due istanze...


Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 17-07-2004, 15.53.58   #201
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Questo è l'esempio visto a lezione da cui ho preso spunto per usare if(argc ==1), perché qui dovrebbe funzionare e nel mio programma no?
Codice:
Esempio di applicazione: trasferimento stringhe tra processi
#include <windows.h>
#include <stdio.h>

#define DISP_ 20
#define Errore_(x) { puts(x);ExitProcess(1); }

char messaggio[256];

void scrittore(HANDLE mapping) {
    char *p;

    p = (char *)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0);
    if ( p == NULL )Errore_("Errore nella chiamata MapViewOfFile");

    puts("Digitare le parole da trasferire in memoria condivisa('quit' per terminare):");
    do
      {
       scanf("%s",messaggio);
       strncpy(p,messaggio, DISP_);
       p += DISP_;
      } while( (strcmp(messaggio,"quit") != 0));

    ExitProcess(0);
}

void lettore(HANDLE mapping) {
    char *p;

    p = (char *)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0);
    if ( p == NULL )Errore_("Errore nella chiamata MapViewOfFile");

    printf("Contenuto memoria condivisa: \n");
    while( (strcmp(p,"quit") != 0))
        {
         printf("%s\n", p);
         p += DISP_;
        }
    ExitProcess(0);
}

int main(int argc, char *argv[]) {
    HANDLE mapping;
    BOOL newprocess;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    if (argc==1)
       {
        /*Creazione/accesso segmento memoria condivisa*/
        mapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
                                    0, 50000, "my_mapping");
        if ( mapping == INVALID_HANDLE_VALUE)Errore_("Errore nella CreateFileMapping");

        /*genero il processo scrittore*/
        memset(&si, 0,sizeof(si));
        memset(&pi, 0,sizeof(pi));
        si.cb=sizeof(si);

        newprocess=CreateProcess(".\\mapper.exe", ".\\mapper.exescrittore", NULL, NULL,
                                 FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
        if (newprocess== 0)
           {
            printf("Errore nella generazione dello scrittore!\n");
            ExitProcess(-1);
           }

        WaitForSingleObject(pi.hProcess, INFINITE);
        memset(&si, 0,sizeof(si)); /*genero il processo lettore*/
        memset(&pi, 0,sizeof(pi));
        si.cb=sizeof(si);
        newprocess=CreateProcess(".\\mapper.exe", ".\\mapper.exelettore", NULL, NULL,
                                 FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
        if (newprocess== 0)
           {
            printf("Errore nella generazione dello scrittore!\n");
            ExitProcess(-1);
           }

        WaitForSingleObject(pi.hProcess, INFINITE);
       }

    else if (argc== 2 &&strcmp(argv[1], "scrittore") == 0)
       {
        mapping =OpenFileMapping(FILE_MAP_WRITE, FALSE, "my_mapping");
        /*Apro ilfile mapping */
        if (mapping == INVALID_HANDLE_VALUE)
           {
            printf("Errore nell'aperuradel mapping!\n");
            ExitProcess(-1)
           }

        scrittore(mapping); /*chiamoloscrittore*/
       }
   else if (argc== 2 &&strcmp(argv[1], "lettore") == 0)
       {
        mapping =OpenFileMapping(FILE_MAP_WRITE, FALSE, "my_mapping"); /*Apro ilfile mapping */
        if (mapping == INVALID_HANDLE_VALUE)
           {
            printf("Errore nell'aperuradel mapping!\n");
            ExitProcess(-1);
           }
        lettore(mapping); /*chiamo il lettore*/
       }
   return(0);
}
Alhazred non è collegato   Rispondi citando
Vecchio 17-07-2004, 16.00.13   #202
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Perché questo programma viene lancaito con un parametro:

"scrittore"
"lettore"

per indicargli quale istanza è...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 17-07-2004, 16.31.20   #203
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
...
Per capire se c'é un altro processo in memoria potresti guardare direttamente la memoria condivisa o provare a crearla oppure utilizzare API che ti restituiscano il nome dei processi ....
Ovvero come prima cosa provare ad attaccarla e se ottengo un INVALID_HANDLE_VALUE vuol dire che ancora non esiste e quindi la creo?
Quota:
Consiglio la creazione di un mini-loader (anche un batch va bene) che si occupi di lanciare le due istanze...
Bye
Quale differenza c'è tra lanciare manualmente le due istanze e farlo con un loader?
Alhazred non è collegato   Rispondi citando
Vecchio 17-07-2004, 16.46.59   #204
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
Alhazred ha scritto:

Ovvero come prima cosa provare ad attaccarla e se ottengo un INVALID_HANDLE_VALUE vuol dire che ancora non esiste e quindi la creo?
Esattamente...

Quota:

Quale differenza c'è tra lanciare manualmente le due istanze e farlo con un loader?
Che creando un loader ad hoc, sei sicuro tu di lanciarne due ... (anche se i controlli vanno comunque fatti) .. lasciando la cosa nelle mani dell'utente potrebbe lancartene una.. due .. tre.... ..

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 17-07-2004, 16.52.54   #205
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

Che creando un loader ad hoc, sei sicuro tu di lanciarne due ... (anche se i controlli vanno comunque fatti) .. lasciando la cosa nelle mani dell'utente potrebbe lancartene una.. due .. tre.... ..

Bye
Ah, ok, sempre la vecchia storia dell'utonto finale
Alhazred non è collegato   Rispondi citando
Vecchio 17-07-2004, 17.18.38   #206
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
L'utente ha un diavolo in corpo .. .. un demone che gli dice che tutto ciò che c'é scritto di NON fare, lui lo deve fare...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 18-07-2004, 11.55.31   #207
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Mi succede una cosa strana, compilo il programma e non ho problemi, modifico la funzione Scrivi(), ricompilo e mi viene restituito questo errore:
error C2198: 'AggiornaCampo' : too few actual parameters

ma AggiornaCampo() non la tocco, perché mi da problemi? L'errore resta anche se tolgo completamente Scrivi()
Codice:
void Scrivi(HANDLE mapping) {
	char c_col = ' ', c_raw = ' ';
	char coorx[3];
    char tmpStr[3];
	int Count2, nave;
	BOOL existingCol = FALSE, existingRaw = FALSE;
	t_Mossa *p;
	coorx[0] = '\0';
    tmpStr[0] = '\0';
	
	p = (t_Mossa*)MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0);
	if(p == NULL)Errore_("\"Scrivi\" non può attaccare la memoria condivisa");
	printf("Inserisci le coordinate per il colpo: Colonna_");
      
         // A-J
         while((c_col < 65) || (c_col > 74)) 
            c_col = getch();

         coorx[0] = c_col;
         printf("%c    Riga_", c_col);
         c_col = ' '; // reset

         // 0-9
         while(((c_raw < 48) || (c_raw > 57))) 
            c_raw = getch();
         printf("%c", c_raw);
         tmpStr[0] = c_raw;
         c_raw = ' '; // reset

         // 0-9 o ENTER per non dare coordinata a cifra singola
         while(((c_raw < 48) || (c_raw > 57)) && (c_raw != 13)) // invio = conferma
            c_raw = getch();
         printf("%c", c_raw);
         tmpStr[1] = c_raw;
         c_raw = ' '; // reset
         
         printf("\n\r"); 
         
         // Scansione duplicati
         for(Count2=0;Count2<(nave-1);Count2++)
		 {
            if(mArray[Count2].colonna == coorx[0])
               existingCol = TRUE;

            if(mArray[Count2].riga == atoi(tmpStr))
               existingRaw = TRUE;
         }

         // Se non esistono duplicati: valorizzo
         if( 
             (existingCol == FALSE) && (existingRaw == FALSE) ||
             (existingCol == FALSE) && (existingRaw == TRUE) ||
             (existingCol == TRUE) && (existingRaw == FALSE)
            )
		 {
            mArray[nave-1].riga = atoi(tmpStr);
            mArray[nave-1].colonna = coorx[0];
            nave++;
         }
         else // altrimenti: avverto e obbligo a inserire nuovamente i valori
            printf("\nSu questa coordinata è gia' stato sparato un colpo.\n", nave);

         // controlli di range delle coordinate di riga.
         if((atoi(tmpStr) < 1) || (atoi(tmpStr) > 10))
         {
            printf("\nValori di colonna validi: A-J, valori di riga validi: 1-10.\n");
            nave--;
         }
	
	
	p->riga = c_raw;
	ExitProcess(0);

}
Non è ancora completa, devo sistemare i controlli e le assegnazioni.
Alhazred non è collegato   Rispondi citando
Vecchio 18-07-2004, 23.25.47   #208
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Non è che per caso .. prima di modificare la funzione "scrivi", hai toccato anche la "aggiornacampo", magari aggiungendo o togliendo qualche parametro .. e non hai poi modificato il prototipo?...

L'errore dato sembra dovuto al fatto che il prototipo sia diverso dall'implementazione...

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 18-07-2004, 23.27.37   #209
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Quota:
Originariamente inviato da P8257 WebMaster
L'utente ha un diavolo in corpo .. .. un demone che gli dice che tutto ciò che c'é scritto di NON fare, lui lo deve fare...

Bye
(Y)

Dav82 non è collegato   Rispondi citando
Vecchio 19-07-2004, 09.05.16   #210
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
Non è che per caso .. prima di modificare la funzione "scrivi", hai toccato anche la "aggiornacampo", magari aggiungendo o togliendo qualche parametro .. e non hai poi modificato il prototipo?...

L'errore dato sembra dovuto al fatto che il prototipo sia diverso dall'implementazione...

Bye
Ti assicuro di no. Ecco cosa ho fatto, ho aperto il file .c, l'ho provato a compilare, tutto ok, ho moficato solo Scrivi(), ho ricompilato e mi è saltato fuori quell'errore. Adesso provo un'altra volta a partire dal file funzionante, rimodifico Scrivi() e vedo che succede.
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: 16.58.37.


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.