004
05.04.2003, 22:33 Uhr
~Heiko
Gast
|
falls jemand mal ein ähnliches Problem hat, ich habe es endlich hinbekommen. scheint zu funktionieren. Die Lösung war einfach den komplette Messthread zu killen und gar nicht zu versuchen Readfile direkt zu killen.
der Header der Klasse sollte ja eigentlich klar sein.
Messgeraete::Messgeraete(){ messflag=0;
h_com = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 , NULL);
DCB dcb; COMMTIMEOUTS cto;
GetCommState(h_com, &dcb);
dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(h_com, &dcb);
GetCommTimeouts(h_com,&cto);
cto.ReadTotalTimeoutConstant=0; cto.ReadTotalTimeoutMultiplier=0;
SetCommTimeouts(h_com,&cto);
}
Messgeraete::~Messgeraete(){
CloseHandle(h_com);
}
DWORD Messgeraete::messenThread(LPVOID lparam){
DWORD dw; int i; unsigned long nBytesRead1,nBytesRead2; char inbuffer1[13]; char inbuffer2[13]; char temp[9]; temp[8]=0;
ReadFile(((Messgeraete*)lparam)->h_com, &inbuffer1, 13, &nBytesRead1, NULL); ReadFile(((Messgeraete*)lparam)->h_com, &inbuffer2, 13, &nBytesRead2, NULL);
for(i=0;i<8;i++) temp[i]=inbuffer1[i+4]; ((Messgeraete*)lparam)->value1=atof(temp);
for(i=0;i<8;i++) temp[i]=inbuffer2[i+4]; ((Messgeraete*)lparam)->value2=atof(temp);
((Messgeraete*)lparam)->messflag=1;
GetExitCodeThread(((Messgeraete*)lparam)->h_messThread, &dw);
ExitThread(dw);
return 0;
}
void Messgeraete::takeValues(){ h_messThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)messenThread, (LPVOID)this, 0, NULL); }
double Messgeraete::getValue(int value){
if (value==1) return value1; else return value2;
}
void Messgeraete::stopThread(){ DWORD dw; GetExitCodeThread(h_messThread, &dw); TerminateThread(h_messThread, dw); value1=value2=-1; messflag=1; }
int Messgeraete::getMessflag(){ return messflag; }
void Messgeraete::resetMessflag(){ messflag=0; } |