![]() |
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
ich hab mir für soetwas folgende Funktion geschrieben:
Delphi-Quellcode:
fFrequency wird vorher mit QueryPerformanceFrequency ermittelt.
procedure TClassName.LoopWait(AMicroseconds: Cardinal);
var lCur, lTo : Int64; begin QueryPerformanceCounter(lTo); lTo := Round(lTo + fFrequency / 1000 * AMicroseconds); repeat QueryPerformanceCounter(lCur); until (lCur >= lTo); end; Wobei ich grad am überlegen bin ob die "1000" da vielleicht doch falsch ist und nicht "1000 * 1000" heißen müsste. :gruebel: |
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
Zitat:
Delphi-Quellcode:
sleep(5000);
|
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
Zitat:
![]() |
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
Zitat:
|
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
Zitat:
Delphi-Quellcode:
var
maxAntwort : double; Endtime : TDateTime; AntwortVorhanden : boolean; // die Variable muss im private Abschnitt des Form sein begin AntwortVorhanden := False; maxAntwort := 5.5; // Sekunden StelleFrage; // Frage auf Bildschirm klopfen Endtime := Now + maxAntwort / (60.0*60.0*24.0); while not AntwortVorhanden or (EndTime > Now) do begin // Ich warte !! Application.ProcessMessages; // Wenn der Benutzer eine Antwort gibt muss die Variable AntwortVorhanden auf True gesetzt werden end; if not AntwortVorhanden then ShowMessages('Deine Zeit ist abgelaufen!!') else begin // Antort prüfen end; |
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
@shmia
Hi, naja mit Frage Antwort Spiel habe ich eigentlich eine Kommunikation über eine Schnittstelle (USB) gemeint, ich sende Daten raus und warte bis Daten wieder zurück kommen (Antwort)... dann überprüfe ich sie auf Richtigkeit usw... |
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
Zitat:
Auch dann sollte man die Systemzeit (Oder GetTimerTicks) benutzen, um den Time-Out zu berechnen.
Delphi-Quellcode:
// Pseudocode, soll nur das Prinzip zeigen
maxAntwort := 5.5; // Sekunden USB_SendMessage(....); Endtime := Now + maxAntwort / (60.0*60.0*24.0); while (EndTime > Now) and not Application.Terminated do begin if USB_ReadMessage(..) then begin // Daten sind da break; // Schleife verlassen end; // Alle angefallenen Event bearbeiten Application.ProcessMessages; end; |
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
Meine Klasse Kommunikation hat folgende Methode:
Delphi-Quellcode:
function TKommunikation.Communicate(Order:TOrder; Adresse:TAdress;var Data:TDaten):Integer;
{ ************************* Kommunikationsmodul ************************** } var Opened:integer; // Variable die den Zustand der Verbindung zeigt {*** Zählervariablen: **} iPolling : integer; // Variable zum Pollen der Schnittstelle iData : integer; // Variable für den Abbruch, falls die Daten falsch sind iTimeout : integer; // Variable für den TimeOut QBytes : integer; // Anzahl der Bytes am Port varcheckchecksum: integer; varcheckcommand : integer; varcheckAdressH : integer; varcheckAdressL : integer; varcheckData1 : integer; varcheckData2 : integer; varcheckData3 : integer; varcheckData4 : integer; dataOk : boolean; i : integer; res : DWord; tick : DWORD; TimeOut : DWORD; MilliSeconds : DWORD; _time: DWORD; _time1: DWORD; time1: Cardinal; time2: Cardinal; Begin // fCS.Enter; { Wechselseitger Ausschluss } //fCS.TryEnter; // _time:= GetTickCount; if NOT(Assigned(Schnittstelle)) then begin result:=300; exit; end; if NOT(Schnittstelle.isConnected) then begin Result:=111; exit; end; dataOk:=true; varcheckcommand:=0; varcheckAdressH:=0; varcheckAdressL:=0; varcheckData1:=0; varcheckData2:=0; varcheckData3:=0; varcheckData4:=0; varcheckchecksum:=0; QBytes:=0; Opened:=0; iData:=1; iTimeOut:=0; // Timeout Variable wird mit 0 initialisiert // Schnittstelle.FlushBufferIN; {Schnittstellenpuffer löschen} // Schnittstelle.FlushBufferOut; {Schnittstellenpuffer löschen} //****************** Befehl wird gesetzt***********************// //Befehl zB.: ReadWord (RW) oder (WR) WriteRequest oder (RF) ReadFloat case Order of READ_WORD: ReadWord(Adresse.RS485Adress,Adresse.AdressHigh,Adresse.AdressLow); READ_BYTE: ReadByte(Adresse.RS485Adress,Adresse.AdressHigh,Adresse.AdressLow); // READ_FLOAT: ReadFloat(Adresse.RS485Adress,Adresse.AdressHigh,Adresse.AdressLow); WRITE_WORD: WriteWord(Adresse.RS485Adress,Adresse.AdressHigh,Adresse.AdressLow,Data.Data1,Data.Data2); WRITE_BYTE: WriteByte(Adresse.RS485Adress,Adresse.AdressHigh,Adresse.AdressLow,Data.Data2); // WRITE_FLOAT: WriteFloat(Adresse.RS485Adress,Adresse.AdressHigh,Adresse.AdressLow,Data.Data1,Data.Data2,Data.Data3,Data.Data4); // WRITE_RESET: WriteReset(Adresse.RS485Adress); WRITE_REQUEST: WriteRequest(Adresse.RS485Adress); end; // ***********************************************************// repeat if Schnittstelle.GetQBytes >0 then begin Schnittstelle.FlushBufferIN; {Schnittstellen[eingangs]puffer löschen} end; Schnittstelle.SendBytes(7,fBufferOut); {Ausgangspuffer senden} iPolling:=1; repeat QBytes:=Schnittstelle.GetQBytes; // Bytes am Port Sleep(SLEEP_POLL_TIME); ////////////////////////////////// HIER wird gepolllt inc(iPolling); until ((QBytes =7) Or (iPolling >I_POLLING_MAX)); if (QBytes=7) then begin Schnittstelle.ReceiveBytes(7,fBufferIn); {Schnittstelleneingang lesen} Result:=0; dataOk:=false; //*********** DATENÜBERPRÜFUNG************ varcheckchecksum := Checkchecksum; varcheckcommand := CheckCommand; varcheckAdressH := CheckAdressH; varcheckAdressL := checkAdressL; //****************************************** // Bei Schreibbefehlen muss der komplette Frame, der gesendet wurde // auch wieder zurückkommen if ((Order=WRITE_REQUEST)Or (Order=WRITE_RESET)Or (Order=WRITE_BYTE)Or (Order=WRITE_WORD)Or (Order=WRITE_FLOAT)) then begin if ((varcheckchecksum=0) and (varcheckcommand=0) and (varcheckAdressH=0)and (varcheckAdressL=0)) then begin dataOk:=true; inc(fCounts); result:=comOK; // Kommunikation i.O. if Assigned(fOnNewCount) then fOnNewCount(fCounts); exit end; end else begin // Bei den Lesebefehlen muss die Checksum + AdresseHigh+ AdresseLow stimmen If ((varcheckchecksum=0) and (varcheckcommand=0) and (varcheckAdressH=0) and (varcheckAdressL=0)) then begin dataOk:=true; result:=comOK; // Kommunikation i.O. // _time1:= GetTickCount - _time; // fDateiListe.Add('Polling:= '+IntToStr(iPolling)); // fDateiListe.Add('Time:= '+IntToStr(_time1)); // fDateiListe.SaveToFile('C:\Logdatei.txt'); // ShowMessage( IntToHex (fbufferIn[1],2) +' '+ IntToStr(_time1)); Data.Data1 := fBufferIn[4]; Data.Data2 := fBufferIn[5]; Data.Data3 := fBufferIn[6]; Data.Data4 := fBufferIn[7]; inc(fCounts); // if Assigned(fOnNewCount) then begin fOnNewCount(fCounts); end; exit; end; end; end; inc(iTimeout); until (iTimeout>=TIME_OUT_WAIT_COUNTS) Or (dataOk=False) ; if (iTimeout>=TIME_OUT_WAIT_COUNTS) then begin Result:=comTimeOut; // TimeOut verursacht if Assigned(OnTimeOut) then begin fOnTimeOut(Self); end; // MessageDlg('TimeOut', mtError, [mbOk], 0); { TODO : TimeOut MessagDlg muss noch entfernt werden } // Schnittstelle.Disconnect; exit; end else begin Result:=comBadData; // Fehler bei den angekommenen Daten // MessageDlg('Fehler bei den angekommenen Daten', mtError, [mbOk], 0);{ TODO : BadData MessagDlg muss noch entfernt werden } fCS.Leave; end; End; Es gibt folgenden ablauf: 1.Senden 2.Warten 3.Überprüfen ob 7 Bytes da sind --> JA dann 7 Bytes lesen und auf Gültigkeit prüfen --> Nein Counter hochzählen weiter mit 3 wenn Counter > x dann nochmal 1 und counter2 hochzählen (also nochmal senden) irgendwann muss abgebrochen werden (nach dem 3. mal Senden beispielsweise..) Gruß |
Re: Dauert Sleep(1) auf allen Windows /Rechnersystemem 1ms?
Verwende bitte die Delphi-Tags
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz