oop - Delphi7中sleep()函数的替代方案

标签 oop delphi

IUfMessung = interface
['{6C258E04-BCC9-4349-912B-57A38F103570}']
    function MacheMessung(Ifl,Ufl: double): double;
end;

  TUFMessungMitHalten = class(TInterfacedObject,IUfMessung)
  private
    SWZeitHalten: double;
  public
    constructor Create(ASWZeitHalten: double); // Time to keep
    destructor Destroy; override;
    function MacheMessung(Ifl,Ufl: double): double; // do measuring 
  end; //   measuring with holding

  TUFMessungMitPause = class(TInterfacedObject,IUfMessung)
  private
    SWZeitPause: double;
    IfMin: double;
  public
    constructor Create(ASWZeitPause: double; AIfMin: double); // Time to keep + I[A]
    destructor Destroy; override;
    function MacheMessung(Ifl,Ufl: double): double;
  end; //   measuring with Pause

  TUFMessung = class(TInterfacedObject)    
  private
    //...
    Messungsart: IUfMessung;
  public
    procedure SetMessungsart(art: IUfMessung); // set measuring type
    procedure MessungsArtAswahl; // measuring type choice
    //...
  end; // do measuring

{ TUFMessung }
    procedure TUFMessung.MessungsArtAswahl;
    begin
        if  not FMitHalten and not FMitPause then  // Uf simple measuring
      begin
        SetMessungsart(TUFMessungEinfach.Create);
      end;

      if FMitHalten and not FMitPause then   // Uf with holding
      begin
        SetMessungsart(TUFMessungMitHalten.Create(FSWZeitHalten));
      end;

      if  not FMitHalten and FMitPause then  // Uf with pause
      begin
        SetMessungsart(TUFMessungMitPause.Create(FSWZeitPause,      FStartIf));
      end;
    end;

procedure TUFMessung.Start(StartIf, EndIf, StepIf, Uleer: double);
begin       
//...
  while not FIstFertig and FUfKannStart do
  begin
    Uf:= Messungsart.MacheMessung(Ifl, FUleer); // <= CALL the measuring
    //...
  end;
end;

{ TUFMessungMitHalten }
function TUFMessungMitHalten.MacheMessung(Ifl, Ufl: double): double;
var i_Zeit: integer;
begin    // Messvorgang
  hole_Uf(true, Ifl, Ufl); // set value
  i_Zeit:= Trunc(SWZeitHalten*1000);
  Application.ProcessMessages;
  Sleep(i_Zeit);  // wait Time ms.
  result:= hole_Uf(false, Ifl, Ufl); // measuring
end;

{ TUFMessungMitPause }
function TUFMessungMitPause.MacheMessung(Ifl, Ufl: double): double;
var i_Zeit: integer;
begin  // Messvorgang
  result:= hole_Uf(false, Ifl, Ufl); // measuring
  hole_Uf(true, IfMin, Ufl); // set value
  i_Zeit:= Trunc(SWZeitPause*1000);
  Application.ProcessMessages;
  Sleep(i_Zeit);  // wait Time ms.
end;

我需要在测量过程之间等待 0 到 5 秒。 sleep () 的解决方案只能运行到 1 秒,因为我在程序中有 RS232 通信和一些计时器。
是否有替代 sleep() 函数的方法使程序恰好在此时等待某个时间?先感谢您。

最佳答案

我无法从您的消息来源得知,但如果您将 RS232 和等待结合起来, sleep 听起来是个坏主意。您能做的最好的事情是让系统在数据进入后立即响应您,而不是盲目地等待。根据您用于进行 RS232 通信的方式,您应该寻找类似 SetCommTimeouts 的内容。并微调读取操作的行为方式:如果数据尚未进入,则停止接收超时,然后响应接收到零字节。这最好通过专用线程完成(可能需要一些学习才能掌握)。另一种选择是使用异步调用(这也需要一些学习才能掌握)。

关于oop - Delphi7中sleep()函数的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39484344/

相关文章:

c# - 托管 CLR 与使用 ClrCreateManagedInstance - 有什么好处?

delphi - Lockbox数字签名组件问题

php - 何时实现和扩展?

delphi - GUI组件能否获得GUI编辑器的网格对齐值?

delphi - 为什么我会收到 "EDBClient: Mismatch in datapacket"异常?

德尔福/ADO : how to get result of Execute()?

java - 使用子类异常实现接口(interface)

C# - 将所有方法参数传递给另一个方法?

PHP在子类中覆盖后通过扩展类访问父类变量

java - 在 Java 中创建对象后编辑对象的方法