PDA

Visualizza la versione completa : [C] Consumo di risorse


UltraBeginner
19-01-2007, 15:09
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!

MItaly
19-01-2007, 15:32
Originariamente inviato da UltraBeginner
Se serve posto il codice!

Direi proprio che serve... :stordita:

UltraBeginner
22-01-2007, 09:09
Eccolo:




#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

oregon
22-01-2007, 11:58
Prova ad inserire uno

Sleep(10);

prima della ReadFile, all'interno del ciclo.

UltraBeginner
22-01-2007, 12:11
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...

MItaly
22-01-2007, 15:59
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).
:ciauz:

Xaratroom
23-01-2007, 15:17
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

UltraBeginner
23-01-2007, 15:35
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?

MItaly
23-01-2007, 15:38
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.

UltraBeginner
23-01-2007, 15:41
ecco Mitaly ma io mi sono sempre chiesto, ma questo famoso buffer quanto e grande?

Loading