2017-10-12 18 views
-2

I développée application qui transfère octets via le port série virtuel en utilisant Delphi 6 et asyncfreeretard de transmission dans delphi

je besoin de retarder le transfert au bout de 10 octets pour synchroniser la transmission. J'utilise windows.sleep(1).

L'application fonctionne très bien lorsque je l'exécute à partir de Delphi IDE. Quand je ferme Delphi et exécute l'application d'exe ... l'application devient lente.

Quelle est la raison?

+0

L'appareil cible ne vous comprend peut-être pas? – Victoria

+0

J'ai réussi la transmition plusieurs fois ... et vraiment je ne pouvais pas comprendre le problème ... Lorsque Delphi ouverte la transmission est rapide et fonctionne très bien ... Lorsque vous fermez juste et exécutez exe ... La transmission est lente –

+1

Je me demande pourquoi les downvotes? –

Répondre

2

L'EDI Delphi définit de toute évidence la valeur de la minuterie du système à une résolution supérieure. Vous pouvez faire la même chose dans votre application en utilisant les fonctions timeBeginPeriod/timeEndPeriod. Voir msdn document et aussi this one regarding sleep function

uses MMSystem; 


    if TimeBeginPeriod(1) = TIMERR_NOERROR then // 1 ms resolution 
    try 
    // The action or process needing higher resolution 
    finally 
    TimeEndPeriod(1); 
    end; 

Juste pour démontrer l'effet que je fait suite à l'application simple, si toute personne intéressée peut vérifier eux-mêmes:

uses System.DateUtils, MMSystem; 

var 
    s, e: TTime; 

procedure SomeDelay; 
var 
    i: integer; 
begin 
    s := Now; 
    for i := 1 to 1000 do 
    Sleep(1); 
    e := Now; 
end; 

procedure TForm19.btnWithClick(Sender: TObject); 
begin 
    if TimeBeginPeriod(1) = TIMERR_NOERROR then // 1 ms resolution 
    try 
    SomeDelay; // The action or process needing higher resolution 
    finally 
    TimeEndPeriod(1); 
    end; 

    Memo1.Lines.Add('with ' + IntToStr(SecondsBetween(s, e))); 
end; 

procedure TForm19.btnWithoutClick(Sender: TObject); 
begin 
    SomeDelay; // The action or process needing higher resolution 
    Memo1.Lines.Add('without ' + IntToStr(SecondsBetween(s, e))); 
end; 

Sortie:

with 1 
without 15 

NOTE Parce que e TimeBeginPeriod affecte la coche du système, assurez-vous de fermer tout programme qui nous permet la même méthode pour modifier la coche de la minuterie, comme les programmes multimédia et similaires (et aussi l'IDE Delphi).

+0

Une meilleure documentation est peut-être [Sleep] (https://msdn.microsoft.com/en-us/library/ms686298 (v = vs.85) .aspx) qui décrit la relation entre les deux fonctions. –

+0

Je ne mettais pas en doute l'exactitude de votre réponse, je sais ce que vous dites est une raison possible. –

+0

@Sertac Merci pour vos commentaires. Mon premier test était avec une boucle de 15000 itérations (ms) avec le 'timeBeginPeriod' cela a pris 15 secondes, sans 231 s! C'était l'éternité :) –