|
| 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 » | |
![]() |
#271 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
La prima istanza dovrebbe: 1) Creare il primo semaforo per se stessa. 2) Creare il secondo semaforo per la seconda istanza 3) Creare la memoria condivisa 4) Restare in attesa della seconda istanza che liberi il primo semaforo. Quindi è la seconda istanza che deve rilasciarlo. Lo fa ? Non mi sembra. Ricontrolla ed assicurati che possano essere lanciate solo 2 istanze dello stesso programma e che soprattutto la prima rimanga in attesa della seconda. ![]() Ti assicuro che NON FUNZIONA per niente ![]() |
![]() |
![]() |
![]() |
#272 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Quanto vale sem[0] dopo il primo OpenSemaphore ?
Quanto vale la costante INVALID_HANDLE_VALUE ? Sei sicuro della correttezza del flusso del codice che hai scritto ? |
![]() |
![]() |
![]() |
#273 | |||
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
Quota:
Quota:
Mi sembra però corretto fino a qui: - parte la prima istanza - crea ed apre i semafori 1 e 2 - crea ed apre la memoria condivisa - rilascia il semaforo 2 quando ha fatto tutto questo - se la seconda istanza parte prima che la prima abbia finito di creare i semafori e la memoria condivisa, resta in attesa perché ha come prima istruzione WaitForSingleObject(sem[1],INFINITE) e sem[1] all'atto della creazione vale 0 C'è qualcosa che non va? |
|||
![]() |
![]() |
![]() |
#274 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Una cosa che non va è che il WaitForSingleObject(sem[1],INFINITE) devo metterlo dopo
Codice:
sem[1] = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"sem2"); if(sem[1] == INVALID_HANDLE_VALUE) Errore_("Errore nell'apertura del semaforo 2"); Però oltre questo mi sembra ok. P.S. Dopo aver salvato le modifiche al file .c ho chiuso Visual C++, l'ho fatto ripartire, ho compilato e il warning non c'è più... mi sa che questo visual c++ non è un granché ![]() |
![]() |
![]() |
![]() |
#275 | |||
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
Quota:
Quota:
![]() E soprattutto, perché hai messo questa faccina ![]() ![]() ![]() Ultima modifica di Alhazred : 26-07-2004 alle ore 14.37.01 |
|||
![]() |
![]() |
![]() |
#276 | |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Quota:
![]() Vorrei che tu imparassi bene da subito ma ti sei impelagato (termine ligure per esprimere incasinamento ![]() Ti ripeto: Lascia perdere per un attimo quello che stai facendo e creati dei piccoli programmini ad hoc. Per esempio cerca di risolvere il fatto che la prima istanza non rimane in attesa del rilascio da parte della seconda. Gestire i semafori è la cosa principale, devi aver chiaro il concetto. Non ti serve un batch per evitare il lancio di sole due istanze, lo puoi fare direttamente nel tuo programma. Ps:Non è una critica nei confronti di WebMaster, si può anche fare così, ci mancherebbe. ![]() |
|
![]() |
![]() |
![]() |
#277 | |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Quota:
![]() |
|
![]() |
![]() |
![]() |
#278 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Guarda qui:
Codice:
#include <windows.h> #include <stdio.h> #include <conio.h> HANDLE sem,sem1; void Blocco(char *s){ sem=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo"); printf(s); printf("\nB L O C C A T O."); WaitForSingleObject(sem,INFINITE); } int main(void){ sem=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo"); sem1=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"semaforo1"); if(sem!=NULL && sem1!=NULL){ printf("Sono ammesse solo 2 istanze del programma !"); Sleep(1000); return 0; } if(sem==NULL){ printf("Prima istanza del programma."); CreateSemaphore(NULL,0,1,"semaforo"); Blocco("\nResta in attesa della seconda istanza..."); CloseHandle(sem1); printf("\nRilasciato"); } else{ CreateSemaphore(NULL,0,1,"semaforo1"); printf("Seconda istanza del programma\nPremi invio per " "rilasciare il semaforo della prima istanza..."); getch(); ReleaseSemaphore(sem,1,NULL); return 0; } getch(); CloseHandle(sem); return 0; } ![]() Ps: Occhio all' INVALID_HANDLE_VALUE. Io non ho messo i controlli per far prima (ed ho fatto male). tu ricordatene, mi raccomando ! INVALID_HANDLE_VALUE mi sta bene con CreateSemaphore e solo con questa funzione o con qualunque altra funzione Create... ![]() |
![]() |
![]() |
![]() |
#279 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Grazie al tuo esempio ho capito come fare in modo che partano solo 2 istanze e bloccare le eventuali in eccesso.
Inoltre adesso sostituendo l'INVALID_HANDLE_VALUE con NULL dopo gli open riesco ad entrare nella prima istanza. Quale differenza c'è tra usare HANDLE sem[2]; (come sto facendo io) e usare HANDLE sem1, sem2; (come hai fatto tu)? |
![]() |
![]() |
![]() |
#280 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Ho una domanda, io ho messo questo codice perché l'ho visto scritto negli esempi, ho una mezza idea di quello che vuol dire, ma mi piacerebbe avere una spiegazione da parte di chi ne sa più di me
memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); si.cb = sizeof(si); |
![]() |
![]() |
![]() |
#281 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
memset è un'istruzione a basso livello solitamente utilizzata per azzerare velocemente il contenuto di un array o di una struttura.
Nel caso in esame, sizeof() esegue il calcolo del contenuto in bytes della struttura, tenendo conto della tipologia di ogni elemento che la costituisce. ![]() |
![]() |
![]() |
![]() |
#282 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Ci sono queste due cose che mi sono rimaste in sospeso e mi piacerebbe risolverle:
Per il controllo col timestamp: - 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? Per l'esempio di lory: Quale differenza c'è tra usare HANDLE sem[2]; (come sto facendo io) e usare HANDLE sem1, sem2; (come hai fatto tu)? |
![]() |
![]() |
![]() |
#283 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
![]() ![]() ![]() |
Differenze non ce ne sono.
E' solo una questione di praticità che deriva da come hai progettato il tutto. Nell'esempio che ho fatto mi sembrava superfluo utilizzare un array ma nella tua applicazione potrebbe aver senso. |
![]() |
![]() |
![]() |
#284 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
![]() |
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 .. Il timestamp "grezzo" è poco "umano" come tipo di dati... se vuoi convertirlo in forma più leggibile ti basta guardare in time.h e troverai le funzioni per renderlo in giorni/mes/anni ecc. ecc. ma a mio avviso in questo caso non è necessario... Bye ![]() |
![]() |
![]() |
![]() |
#285 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
![]() |
Ora è chiaro, grazie
![]() |
![]() |
![]() |
![]() |
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 |