PDA

View Full Version : sms



بمب منطقی
یک شنبه 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 استفاده شده.از راهنماییتون کمال تشکر رو دارم.

Mask
یک شنبه 10 اردیبهشت 1391, 11:20 صبح
من باشم اصلا از تایمر استفاده نمیکنم.
توسط یه روال چنتا ترد میسازم و شروع به ارسال میکنم. وقتی کار یه ترد تموم شد به یه روال پیغام میدم که یه ترد دیگه بساز و یه شماره بهش اختصاص میدم و شروع به ارسال میکنم.

بمب منطقی
یک شنبه 10 اردیبهشت 1391, 12:18 عصر
نه نمیشه.چون table ی که ازش متن پیام و شماره مقصد دریافت میشه مدام در حال پر شدن از جایی دیگه و خالی شدن توسط تایمره.طبق کد بالا timer مدام در حال چک کردن اون table هست و هر وقت table پر باشه اطلاعاتش رو ارسال و table رو تخلیه میکنه و table هم از جایی دیگه تغذیه میشه. تمام این کارها اتومات انجام میشن و دستی نیستن.