Delphi TTimer дает необычные результаты в Win 10

Если это была проблема с пространством имен, есть возможность попытаться изменить две вещи в файле xslt:

  • добавить определение «моего» пространства имен в xsl: tagheet tag
  • использовать префикс «my:» при вызове элементов при перемещении xml-файла.

result

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/" >
        <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <NewRoot xmlns="http://wherever.com">
                    <NewChild>
                        <ChildID>ABCD</ChildID>
                        <ChildData>
                            <xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
                        </ChildData>
                    </NewChild>
                </NewRoot>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>
</xsl:stylesheet>
-2
задан Remy Lebeau 1 March 2019 в 21:47
поделиться

1 ответ

Это ужасный способ отслеживать прошедшее время с помощью TTimer. TTimer не является таймером реального времени или даже точным таймером. Он основан на оконном сообщении WM_TIMER , которое

является сообщением с низким приоритетом. Функции GetMessage и PeekMessage отправляют это сообщение только в том случае, если в очереди сообщений потока нет других сообщений с более высоким приоритетом .

Не рассчитывайте ElapsedTime исходя из того, как часто TTimer запускает событие OnTimer. Следите за текущим текущим временем при запуске TTimer, а затем вычитайте это значение из следующего текущего времени всякий раз, когда событие OnTimer генерируется и в конечном итоге генерируется , Это даст вам более реальное прошедшее время.

Попробуйте что-нибудь более похожее на это:

uses
  ..., System.DateUtils;

private
  StartTime: TDateTime;
  ElapsedSecs: Int64;

procedure TfmTimeCard.btnTimerClick(Sender: TObject);
begin
  if btnTimer.Tag = 0 then
  begin
    btnTimer.Tag := 1;
    ...
    ElapsedSecs := 0;
    StartTime := Now;
    Timer1.Enabled := true;
    ...
  end
  else
  begin
    btnTimer.Tag := 0;
    ...
    ElapsedSecs := SecondsBetween(Now, StartTime);
    Timer1.Enabled := false;
    ...
  end;
end;

procedure TfmTimeCard.Timer1Timer(Sender: TObject);
begin
  if btnTimer.Tag = 1 then
  begin
    ElapsedSecs := SecondsBetween(Now, StartTime);
    // use ElapsedSecs as needed ...
  end;
end;

Или:

uses
  ..., Winapi.Windows;

private
  StartTime: DWORD;
  ElapsedSecs: Integer;

procedure TfmTimeCard.btnTimerClick(Sender: TObject);
begin
  if btnTimer.Tag = 0 then
  begin
    btnTimer.Tag := 1;
    ...
    ElapsedSecs := 0;
    StartTime := GetTickCount;
    Timer1.Enabled := true;
    ...
  end
  else
  begin
    btnTimer.Tag := 0;
    ...
    ElapsedSecs := (GetTickCount - StartTime) div 1000;
    Timer1.Enabled := false;
    ...
  end;
end;

procedure TfmTimeCard.Timer1Timer(Sender: TObject);
begin
  if btnTimer.Tag = 1 then
  begin
    ElapsedSecs := (GetTickCount - StartTime) div 1000;
    // use ElapsedSecs as needed ...
  end;
end;

Или:

uses
  ..., System.Diagnostics;

private
  SW: TStopwatch;
  ElapsedSecs: Integer;

procedure TfmTimeCard.btnTimerClick(Sender: TObject);
begin
  if not SW.IsRunning then
  begin
    ...
    ElapsedSecs := 0;
    SW := TStopWatch.Start;
    Timer1.Enabled := true;
    ...
  end
  else
  begin
    ...
    SW.Stop;
    ElapsedSecs := Trunc(SW.Elapsed.TotalSeconds);
    Timer1.Enabled := false;
    ...
  end;
end;

procedure TfmTimeCard.Timer1Timer(Sender: TObject);
begin
  if SW.IsRunning then
  begin
    ElapsedSecs := Trunc(SW.Elapsed.TotalSeconds);
    // use ElapsedSecs as needed ...
  end;
end;
0
ответ дан Remy Lebeau 1 March 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: