Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: [C] Consumo di risorse

  1. #1

    [C] Consumo di risorse

    Ciao a tutti,

    ho fatto un programmino che trasmette una stringa seriale a una scheda e aspetta le risposte che la stessa scheda fornisce, scrivendo poi su file i dati ricevuti.
    Tutto funziona, ma andando vedere il task manager vedo ke quando il programma gira occupa il 50 % di CPU!!!
    Avete qualche spiegazione in proposito?
    Se serve posto il codice!

    Saluti!

  2. #2

    Re: [C] Consumo di risorse

    Originariamente inviato da UltraBeginner
    Se serve posto il codice!
    Direi proprio che serve...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3

    Ecco

    Eccolo:

    Codice PHP:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winbase.h>

    void stampa(void *Rx,FILE *fp); //stampa dei dati ricevuti IN: handle della porta OUT:niente
    void inizializza(HANDLE Rx);  // setting della porta IN: handle della porta OUT:niente

    int main()   //inizio main
    {
     
    FILE *fp;
    char *NomePorta={"COM1:"};
    OVERLAPPED osWrite = {0};
    DWORD dwNumBytesWritten,zero=0;
    HANDLE Rx;

    int i=1,scelta=0;


    // apertura file dove scrivere i dati

    fp=fopen("Dati.txt","w");

    // Creazione dell handle relativo all apertura della porta in lettura/scrittura(COM1)

    Rx =      CreateFile(NomePorta,  
                         
    GENERIC_READ GENERIC_WRITE
                         
    0
                         
    0
                         
    OPEN_EXISTING,
                         
    zero,
                         
    0);
    if (
    Rx == INVALID_HANDLE_VALUE)       
       {exit(
    0);}// error opening port; abort
     
    inizializza(Rx);     // inizializzazione porta COM1

    printf("Inserire numero di misure da fare\n");
    scanf("%d",&scelta);
    for(
    i=0;i<=scelta;i++)
    {
    fprintf(fp,"Misura %d\n\n",i);
    WriteFile(Rx,"S A\n",4,&dwNumBytesWritten,&osWrite);   // invio stringa S A, misura su tutti i sensori
    stampa(Rx,fp);                                            // stampa su file dei risultati
    }
       
    fclose(fp);
    CloseHandle(Rx);
    return 
    0;
    }  
    // FINE MAIN


    void stampa(void Rx,FILE *fp// INIZIO FUNZIONE STAMPA
    {
     
    DWORD dwBytesTransferred=0;
     
    char prova;
     
    int conteggio=0,numero=3;
     
    fprintf(fp,"Sensore %d\n",numero);
     
    numero--;
     while(
    prova!='>')
       {
        
    ReadFile   (Rx,                // Port handle
                    
    &prova,                // Pointer to data to read
                    
    1,                    // Number of bytes to read
                    
    &dwBytesTransferred,  // Pointer to number of bytes read
                    
    NULL                  // Must be NULL for Windows CE
                    
    );
        if(
    dwBytesTransferred!=0
         {
           if(
    isdigit(prova)||prova=='\n')  // stampa solo i numeri o i \n
             
    {
               if(
    prova=='\n')
                
    conteggio++;
               
    fprintf(fp,"%c",prova);
               if(
    conteggio==2&&numero>=0)
                {
                 
    fprintf(fp,"Sensore %d\n",numero);
                 
    conteggio=0;
                 
    numero--;
                }
               
              }
        }
      } 
    }  
    // FINE FUNZIONE STAMPA

    void inizializza(HANDLE Rx)  //INIZIO FUNZIONE INIZIALIZZA
    {
     
     
    DWORD timeout=1000;
     
    DCB PortDCB;
     
    GetCommState(Rx,&PortDCB); // Preleva i setting attuali della porta

    // setting dei paramentri (9600 8N1)
    PortDCB.BaudRate 9600;              // Current baud 
    PortDCB.fBinary TRUE;               // Binary mode; no EOF check 
    PortDCB.fParity FALSE;               // Enable parity checking 
    PortDCB.fOutxCtsFlow FALSE;         // No CTS output flow control 
    PortDCB.fOutxDsrFlow FALSE;         // No DSR output flow control 
    PortDCB.fDtrControl DTR_CONTROL_DISABLE
                                          
    // DTR flow control type 
    PortDCB.fDsrSensitivity FALSE;      // DSR sensitivity 
    PortDCB.fTXContinueOnXoff FALSE;     // XOFF continues Tx 
    PortDCB.fOutX FALSE;                // No XON/XOFF out flow control 
    PortDCB.fInX FALSE;                 // No XON/XOFF in flow control 
    PortDCB.fErrorChar FALSE;           // Disable error replacement 
    PortDCB.fNull FALSE;                // Disable null stripping 
    PortDCB.fRtsControl RTS_CONTROL_DISABLE
                                          
    // RTS flow control 
    PortDCB.fAbortOnError FALSE;        // Do not abort reads/writes on 
                                          // error
    PortDCB.ByteSize 8;                 // Number of bits/byte, 4-8 
    PortDCB.Parity NOPARITY;            // 0-4=no,odd,even,mark,space 
    PortDCB.StopBits ONESTOPBIT;        // 0,1,2 = 1, 1.5, 2 

    SetCommState(Rx,&PortDCB); // Setting della porta

     
    // FINE FUNZIONE INIALIZZA 

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prova ad inserire uno

    Sleep(10);

    prima della ReadFile, all'interno del ciclo.

  5. #5

    Thanks!

    Perfetto funziona,
    il consumo è crollato, potresti però spiegarmi il motivo di questo accorgimento?

    [edit] forse fai si che la ReadFile non sia sempre attiva usando uno sleep prima di ogni lettura? ho sparato questa cosa a "naso" nn so se sia giusta...

  6. #6
    Senza la sleep il programma continua ad eseguire quel ciclo all'impazzata, mangiandosi risorse in una maniera vergognosa senza che sia realmente necessario (la COM è un porta lenta...). La sleep fa sì che tra un'esecuzione del ciclo e l'altra ci sia una pausa di 10 millisecondi (che io aumenterei anche a 50).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Di solito quello che hai fatto (driver a controllo di programma) viene utilizzato nelle stampanti o comunque nelle comunicazioni con interfacce veloci e sempre disponibili
    Experience is what you get when you don’t get what you want

  8. #8

    ah oks!

    in pratica detto cosi a naso, dato ke la COM1 e lentissima nel frattemo la ReadFile si gira i pollici e occupa un sacco di risorse...puo essere corretta come spiegazione?

  9. #9
    Non è solo la ReadFile che impiega risorse, è l'intero ciclo che viene eseguito all'infinito senza pause. Inoltre anche se la COM1 fosse più veloce non si correrebbero rischi ad inserire un ritardo nel ciclo, perché comunque i dati ricevuti vengono immagazzinati in un buffer prima di essere recuperati con la ReadFile.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10

    ecco

    ecco Mitaly ma io mi sono sempre chiesto, ma questo famoso buffer quanto e grande?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.