PDA

View Full Version : سوال: حل مشکل زمان اجرای دستور داخل تایمر .



تجلی
شنبه 30 اردیبهشت 1391, 20:39 عصر
سلام .
فرض کنید تایمری داریم که هر 10 میلی ثانیه یکبار اجرا میشه ولی دستوری که در داخل این تایمر باید اجرا بشه میتونه بیشتر از 10 میلی ثانیه هم طول بکشه یعنی شرایطی به وجود میاد که هنوز پردازش دستورات داخل تایمر به پایان نرسیده ولی تایمر دوباره فرمان اجرای دستورات داخل خودش رو میده .

سوال اینجاست که :
آیا تایمر صبر میکنه دستورات رو به پایان برسونه و بعد 10 ثانیه صبر میکنه و مجدد فرمان میده یا اینکه تایمر کاری با تموم شدن دستورات داخلش نداره و ممکنه قبل از تموم شدن اونها فرمان اجرای مجدد دستور رو بده در این حالت چطور میشه این مشکل رو حل کرد چون فکر میکنم برنامه دچار خطا بشه .


متشکرم.

Ananas
شنبه 30 اردیبهشت 1391, 23:17 عصر
سلام.
صبر میکنه تا فرمان تموم بشه بعد دوباره اجرا میکنه. میتونی امتحان کنی. یک تایمر بساز و یک کار طولانی داخل تایمر و هر بار یک واحد به یک پارامتر اضافه کن و نتیجه رو ببین.
مثال : یک تایمر روی فرم اضافه کن و Interval رو به 1 تنظیم کن (1 هزارم ثانیه) و رویداد FormCreate و OnTimer رو براش بساز و این کد رو کپی کن :

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
x : Integer;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
x := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i, j : Integer;
begin
Self.Caption := IntToStr(x);
for i := 0 to 400 do
begin
for j := 0 to 300 do
begin
Self.Canvas.Pixels[i + x, j] := x;
end;
end;
x := x + 1;
end;

end.


برنامه رو که اجرا میکنی caption فرم با هر بار اجرای OnTimer یک واحد اضافه میشه. ببین واقعا 1 هزارم ثانیه هست؟ برای من که حدودا 0.5 ثانیه یک بار تغییر میکنه.