Если я вас правильно понимаю, все, что вам нужно знать, это как распознать, когда достигнуто определенное время для выполнения этой цепочки. Действительно, таймер не обязательно является идеальным инструментом для этого, так как таймеры фактически не срабатывают в режиме реального времени (интервал может составлять 500 мсек, но через 1 минуту или 60 000 мсек он не будет быть идеально выровненным до точного 120 казней, как вы пожелаете). Однако это не означает, что мы не можем использовать таймеры.
Внутри таймера (или вы можете создать для этого еще один повторяющийся поток) вы просто получаете текущую дату / время. ВАЖНО: убедитесь, что интервал этого таймера или потока составляет меньше, чем полсекунды - это гарантирует, что ваше время не будет упущено. Так что вы читаете это так ...
uses
DateUtils;
.....
var
HasExecuted: Bool;
.....
constructor TForm1.Create(Sender: TObject);
begin
HasExecuted:= False;
end;
procedure TimerOnTimer(Sender: TObject);
var
N, A: TDateTime;
Thread: TMyThread;
begin
N := Now;
A := StrToDateTime('11/20/2011 15:30:30'); //24 hour time
//If now is within 1 second over/under alarm time...
if (N >= IncSecond(A, -1)) and (N <= IncSecond(A, 1)) then
begin
if not HasExecuted then begin
HasExecuted:= True;
aThread := tMyThread.Create(true);
aThread.Resume; //The thread will execute once and terminate;
end;
end;
end;
Это, вероятно, не работает для вас, потому что вы используете оператор =
. Что если этот таймер пропустит эту 1 секунду? Одно выполнение может быть вторым раньше, а следующее выполнение может быть вторым ответом, и в этом случае это выражение не будет оцениваться как равное true.
С другой стороны, ваш TMyThread
конструктор - переопределяете ли вы это? Если да, то False
все еще является исходным параметром CreateSuspended
? Если это так, то вы говорите, чтобы этот поток выполнялся сразу после создания. Передайте True
в этом параметре, чтобы он был приостановлен при создании, потому что я вижу, что вы также вызываете Thread.Resume
ниже этого значения (что, если параметр остается ложным, он уже возобновляется). С другой стороны, вам также не нужно создавать этот поток (по крайней мере, я так предполагаю), если время не истекло. Почему вы создаете это, прежде чем даже проверить? Он создает один из них каждый раз, когда выполняется этот таймер (я предполагаю, что это поток, который по мере необходимости будет заботиться о загрузке). Кроме того, убедитесь, что поток правильно освобождает себя, когда он закончил, а не просто застрял ...
constructor TMyThread.Create(CreateSuspended: Bool);
begin
inherited Create(CreateSuspended);
FreeOnTerminate:= True; //Make sure it free's its self when it's terminated
end;
EDIT:
Я что-то упустил - если, скажем, интервал этого таймера был 1 (он должен быть больше как 200-400), то он мог бы очень хорошо выполняться много раз подряд, в течение этого периода времени. Я изменил приведенный выше код, чтобы убедиться, что он выполняется только один раз. ПРИМЕЧАНИЕ. Этот код был набран по памяти, а не в среде Delphi.