Pagina 3 di 5 primaprima 1 2 3 4 5 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 41
  1. #21
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    funziona ma in modo incomprensibile

  2. #22
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da misterx
    funziona ma in modo incomprensibile
    Non avendo presente tutto il programma (nè vedendolo in esecuzione) non posso dirti cosa possa esserci che non va ... ma non credo sia proprio "incomprensibile" ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #23
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    a grandi linee

    codice:
    chiaramente nella main()
    
    hMutex = CreateMutex(NULL, FALSE,NULL);
    hEvent = CreateEvent ( NULL , false , false , "Event 10234" );
    
    produttore = CreateThread(NULL,0,ThreadProduttore,NULL,0,&ID1);
    consumatore = CreateThread(NULL,0,ThreadConsumatore,NULL,0,&ID2);
    scrittore = CreateThread(NULL,0,ThreadScrittore,NULL,0,&ID2);
    
    
    il thread produttore genera banalmente numeri casuali che mette nell'array sensore[]
    
    
    // thread consumatore
    while(!bAbort)
    {
    WaitForSingleObject(hMutex,INFINITE);
    
                            for(int i=0; i < l; i++)
                            {
                                    stato[i]=( sensore[comp[i]] & (int)pow(2,nbit[i]) );
    
    
                                    if( stato[i] != oldstato[i])
                                    {
                                            
                                            t2 = tempo();
    
                                            sprintf(miobuf,"%d, %d.%d, %d %d", comp[i], nbit[i], stato[i], ml2-tempo[i], comp[i]);
    
                                            SetEvent ( hEvent );
    
                                            
                                            tempo[i] = tempo();
                                    }
                            oldstato[i]=stato[i];
    
                            } // end for(int i=0; ....)
    
                    ReleaseMutex(hMutex);
                    Sleep(20)
    }
    
    
    // thread scrittore
    
            while(!bAbort)
            {
                    WaitForSingleObject ( hEvent, INFINITE );
    
                    printf("output: %s\n", miobuf);
    
                 Sleep(20);
            }
            return 0;

  4. #24
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    E cosa non va ? Perché dici che "funziona ma in modo incomprensibile" ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #25
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    Originariamente inviato da oregon
    E cosa non va ? Perché dici che "funziona ma in modo incomprensibile" ?
    dove c'è il buffer con la sprintf() prima avevo usato 5 variabili intere globali che venivano lette da srittore, a quanto pare l'assegnamento sembra sottrarre tempo maggiore rispetto alla sprintf(), però ciò mi suona molto strano.

    Purtroppo non ricordo molto di assembler ma a me sembrava che un assegnamento costasse meno di una copia da indirizzo a indirizzo, magari ricordo male io.

    Ad ogni modo, senza un bello Sleep() il processore del mio PC va in ebollizione. Ora l'output viene inviato ad un componente di tipo StringGrid() e devo dire ch enon brilla certo di efficienza.

    Non ho acnora capito che invalida l'evento e cioè se dopo l'uso viene autoeliminato

  6. #26
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da misterx
    dove c'è il buffer con la sprintf() prima avevo usato 5 variabili intere globali che venivano lette da srittore, a quanto pare l'assegnamento sembra sottrarre tempo maggiore rispetto alla sprintf(), però ciò mi suona molto strano.
    Ma di quale assegnamento parli?

    Faccio fatica a seguirti perché tu ragioni pensando che gli altri abbiano chiaro tutto il "contesto" di cui tu non parli ...

    Comunque, non inserirei in un ciclo una chiamata come

    (int)pow(2,nbit[ i ])

    dato che la funzione pow è abbastanza pesante.
    Utilizza una piccola tabella precalcolata di interi (come 1,2,4,8 ...) ...

    Purtroppo non ricordo molto di assembler ma a me sembrava che un assegnamento costasse meno di una copia da indirizzo a indirizzo, magari ricordo male io.
    Un assegnamento è comunque una copia da indirizzo ad indirizzo ... ma, ripeto, di cosa parliamo esattamente?

    Ad ogni modo, senza un bello Sleep() il processore del mio PC va in ebollizione.
    Questo è ovvio ... la Sleep *deve* essere sempre usata, altrimenti il sistema non ha il tempo per rilasciare il thread e la CPU scoppia ...

    Ora l'output viene inviato ad un componente di tipo StringGrid() e devo dire ch enon brilla certo di efficienza.
    Beh ... non so cosa intendi anche perché non so cosa viene prodotto, a che velocità ... insomma, non posso giudicare ...

    Non ho acnora capito che invalida l'evento e cioè se dopo l'uso viene autoeliminato
    Questa documentazione non la vuoi proprio leggere, neanche quando hai una curiosità ...
    Il secondo parametro della CreateEvent è

    bManualReset [in]
    If this parameter is TRUE, the function creates a manual-reset event object, which requires the use of the ResetEvent function to set the event state to nonsignaled. If this parameter is FALSE, the function creates an auto-reset event object, and system automatically resets the event state to nonsignaled after a single waiting thread has been released.


    e tu l'hai impostata a FALSE quindi in modalità auto-reset
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #27
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    mi era proprio sfuggita che l'evento si resettava da solo, sorry.

    Per l'assegnamento in tendo questo punto:

    sprintf(miobuf,"%d, %d.%d, %d %d", comp[i], nbit[i], stato[i], ml2-tempo[i], comp[i]);

    avevo usato una cosa del tipo:

    q1=comp[i];
    q2=nbit[i];
    q3=stato[i];
    q4=ml2-tempo[i];
    q5=comp[i];

    tutte variabili globali, cose che ai docenti piacciono poco.

    Tali variabili q1.....q5 venivano stampate a video e salvate su disco ma con un dispendio maggiore, questo non riesco a spiegarmelo, difatti il thread scrittore "viaggiava", per così dire, ad un decimo degli altri due thread.

    Hai ragione quando dici che mi esprimo pensando di essere capito al volo

  8. #28
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da misterx
    mi era proprio sfuggita che l'evento si resettava da solo, sorry.
    No problem ... vale per il prossimo dubbio ...

    Per l'assegnamento in tendo questo punto:
    Cioè, per vedere se ho capito, tu stai confrontando una

    sprintf(miobuf,"%d, %d.%d, %d %d", comp[i], nbit[i], stato[i], ml2-tempo[i], comp[i]);

    con una

    sprintf(miobuf,"%d, %d.%d, %d %d", q1, q2, q3, q4, q5);

    ?

    E le

    q1=comp[i];
    q2=nbit[i];
    q3=stato[i];
    q4=ml2-tempo[i];
    q5=comp[i];

    dove erano?

    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #29
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    cavolo come scrivo male


    sprintf(miobuf,"%d, %d.%d, %d %d", q1, q2, q3, q4, q5);


    in una precedente versione il thread consumatore eseguiva il seguente assegnamento:

    q1=comp[i];
    q2=nbit[i];
    q3=stato[i];
    q4=ml2-tempo[i];
    q5=comp[i];

    dove gli array comp[], nbit[], stato[], tempo[] sono locali al thread consumatore e invece le q1......q5 le avevo dichiarate globali.

    poi nle thread scrittore facevo quindi:
    sprintf(miobuf,"%d, %d.%d, %d %d", q1, q2, q3, q4, q5);


    Nella seconda versione ho dichiarato un buffer globale ed ho copiato i valori degli array citati con la:
    sprintf(miobuf,"%d, %d.%d, %d %d", comp[i], nbit[i], stato[i], ml2-tempo[i], comp[i]);

    quindi ora, nella nuova versione nel thread scrittore ora scrivo banalmente

    printf("%s", miobuf);

    e le prestazioni generali sono notevolmente migliorate

  10. #30
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da misterx

    e le prestazioni generali sono notevolmente migliorate
    E mi pare giusto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.