Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Readfile Abrrechen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.04.2003, 17:48 Uhr
~Heiko
Gast


Hallo,

ich habe folgendes Problem.
Ich will von der Seriellen Schnittelle was einlesen. Das funktioniert auch so weit.

Ich will ReadFile ohne timeout benutzen.
Wie kann man den ReadFile noch abbrechen, nach dem er gestarten ist, wenn kein Timeout gesezt wurde.

Ich habe mir einen Thread gebastelt, der mittels CancelIO(h_com) den ReadFile killen sollen. Hat aber leider nicht geklaptt. Der Compiler frist zwar alles, aber der Thread in dem der ReadFile aufgerufen wird bleibt immer bei diesem Befehl (dem Readfile) stehen.

Wer kann mir helfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.04.2003, 12:30 Uhr
~Michael
Gast


Ich habe zwar keine Ahnung von ReadFile,
aber lass doch Thread in einer Schleife laufen und nutze eine Variable als
"Tor"!


C++:
#define TIMEOUT 250
bool bTor = TRUE;

while(true)
{
if(bTor) ReadFile(TIMOUT,...);
}



dann kannst du von aussen die Variable setzen und er unterbricht! Aber von aussen sieht es auch so aus als würde ReadFile ohne Timeout arbeiten!
Ist nur so ne Idee

Michael
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.04.2003, 14:05 Uhr
~Heiko
Gast


Das geht leider nicht. Hatte ich am Anfang so gemacht.
Ich lese zweimal 13 Bytes (13. ist jeweils carriage return) von com1 ein.
Wichtig hierbei ist, das die Übertragung möglichst nur einmal erfolgen soll.
Wenn ich das so mache wie du vorgeschlagen hast passiert es leider öffter, das er nur noch die 2. 13 bytes bekommt aber die ersten verloren sind. (Und das passiert leider zu oft, als das es noch akzeptable wäre).

Deine Vorgeschlagene Lösung würde halbwegs funktionieren, wenn ich die möglichkeit hätte komplett ohne ein zweites Mal readfile aufrufen zu müssen 26 Bytes zu lesen, aber readfile terminiert immer nach dem carriage return.

Das mit dem Carriage Return kann ich auch nicht ändern. (Ist von der Hardware vorgegeben);

Vielleicht kennt ja jemand eine möglichkeit, das ich ihm irgendwie zweimal 13 dummybytes schicken kann. Wenn ich aber allerdings erst mal den Readfile aufgerufen habe. läst der leider kein Writefile mehr zu, bis der readfile terminiert hat. Kennt jemand ne andere Möglichkeit?

Danke Heiko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.04.2003, 14:09 Uhr
~Heiko
Gast


Ups Sorry ich habe deine Antwort erst nicht richtig gelesen gehabt.
Ich dachte du meintest ich solle readfile mit einem kleinen Timeout benutzen und immer wieder abchecken ob er schon was bekommen hat und dann die schleife erneut starten.

Dein Vorschlag geht aber leider nicht.
Man kann zwar einen Timeout noch setzen, dieser Wert gilt aber erst ab dem nächsten Readfile-aufruf.
Damit habe ich also weiterhin das Problem das ich den ersten Readfile nicht tot kriege.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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; }
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: