بمب منطقی
یک شنبه 10 اردیبهشت 1391, 10:52 صبح
با سلام.
شرح برنامه : به طور خیلی مختصر من یه برنامه نوشتم که که در بازه های یک ثانیه به یک ثانیه (توسط تایمر) روتین ارسال sms رو فعال میکنه و sms هایی رو به افراد موجود در جدولی از بانک اطلاعاتی ارسال میکنه.
مشکل : حالا مشکل اینجاست که وقتی این روتین شروع بکار میکنه،ارسال تمامی اسمس ها شاید چند دقیقه یا ساعت طول بکشه (که زمانش در دست نیست) ولی timer در هر ثانیه فراخوانی میشه و روتین ارسال sms دوباره فعال میشه و دوباره کاری میشه.
سوال: و سوال اینجاست که چطور به timer حالی کنم! که اگه روتین در حال اجرا باشه و به اتمام نرسیده باشه دوباره روتین رو اجرا نکن.
راه حل اولیه: خودم این راه رو انجام دادم ولی جوام نگرفتم: متغییر boolean ای رو بطور سراسری تعریف کردم و در شروع روتین sms اونو true کردم و در انتهای روتین اونو false کردم. و در timer قبل از فراخوانی روتین sms این شرط رو گذاشتم که اگه اون متغیر عمومی False باشه روتین رو اجرا کن و در غیر اینصورت اجرا نکن.که جواب نگرفتم!
کد: کد مربوط به timer و روتین sms در ذیل(is_active همون متغیر سراسری می باشد):
var
is_active:boolean;
procedure Tsmain.Timer1Timer(Sender: TObject);
var Id,number,text:string;
counter:Integer;
begin
if not(is_active)then
begin
is_active:=True;
ADOQselect_send.SQL.Clear;
ADOQselect_send.SQL.Add('select * from send');
ADOQselect_send.Open;
ADOQselect_send.First;
SetLength(del_arr,ADOQselect_send.RecordCount);
counter:=0;
while not ADOQselect_send.Eof do
begin
ID:=ADOQselect_send.Fields[0].AsString;
number:=ADOQselect_send.Fields[1].AsString;
text:=ADOQselect_send.Fields.Fields[2].AsString;
if(send(number,text))then begin
sent(ID);
end
else begin
KylixSMS1.GetLastError(1);
not_sent(ID);
end;
counter:=counter+1;
ADOQselect_send.Next;
end;
del_sended_n_sented();
is_active:=False;;
end
end;
برای ارسال اسمس از kylix استفاده شده.از راهنماییتون کمال تشکر رو دارم.
شرح برنامه : به طور خیلی مختصر من یه برنامه نوشتم که که در بازه های یک ثانیه به یک ثانیه (توسط تایمر) روتین ارسال sms رو فعال میکنه و sms هایی رو به افراد موجود در جدولی از بانک اطلاعاتی ارسال میکنه.
مشکل : حالا مشکل اینجاست که وقتی این روتین شروع بکار میکنه،ارسال تمامی اسمس ها شاید چند دقیقه یا ساعت طول بکشه (که زمانش در دست نیست) ولی timer در هر ثانیه فراخوانی میشه و روتین ارسال sms دوباره فعال میشه و دوباره کاری میشه.
سوال: و سوال اینجاست که چطور به timer حالی کنم! که اگه روتین در حال اجرا باشه و به اتمام نرسیده باشه دوباره روتین رو اجرا نکن.
راه حل اولیه: خودم این راه رو انجام دادم ولی جوام نگرفتم: متغییر boolean ای رو بطور سراسری تعریف کردم و در شروع روتین sms اونو true کردم و در انتهای روتین اونو false کردم. و در timer قبل از فراخوانی روتین sms این شرط رو گذاشتم که اگه اون متغیر عمومی False باشه روتین رو اجرا کن و در غیر اینصورت اجرا نکن.که جواب نگرفتم!
کد: کد مربوط به timer و روتین sms در ذیل(is_active همون متغیر سراسری می باشد):
var
is_active:boolean;
procedure Tsmain.Timer1Timer(Sender: TObject);
var Id,number,text:string;
counter:Integer;
begin
if not(is_active)then
begin
is_active:=True;
ADOQselect_send.SQL.Clear;
ADOQselect_send.SQL.Add('select * from send');
ADOQselect_send.Open;
ADOQselect_send.First;
SetLength(del_arr,ADOQselect_send.RecordCount);
counter:=0;
while not ADOQselect_send.Eof do
begin
ID:=ADOQselect_send.Fields[0].AsString;
number:=ADOQselect_send.Fields[1].AsString;
text:=ADOQselect_send.Fields.Fields[2].AsString;
if(send(number,text))then begin
sent(ID);
end
else begin
KylixSMS1.GetLastError(1);
not_sent(ID);
end;
counter:=counter+1;
ADOQselect_send.Next;
end;
del_sended_n_sented();
is_active:=False;;
end
end;
برای ارسال اسمس از kylix استفاده شده.از راهنماییتون کمال تشکر رو دارم.