PDA

View Full Version : سوال: ارسال sms با استفاده از BackgroundWorker



Sal_64
دوشنبه 11 اردیبهشت 1391, 12:55 عصر
سلام
داخل برنامم بوسیله gsm و با وقفه 5 ثانیه بین هر ارسال اقدام به ارسال پیامک میکنم
حالا تصمیم دارم که تابع ارسال در یک نخ دیگه انجام بشه
به همین دلیل با استفاده از نمونه کدهای داخل سایت BackgroundWorker پیاده سازی کردم
و تابع ارسال که خودش از چندیت تابع دیگه تشکل شده با استفاده از این کد فراخوانی کردم

void worker_DoWork(object sender, DoWorkEventArgs e)
{
Invoke(new MethodInvoker(delegate { send_gsm_sms(); }));
}

اما این روی این قطعه کد در فرم اصلی برنامه (فرم فراخواننده فرم ارسال پیامک)

private void bn_sms_Click(object sender, EventArgs e)
{
f_sms fs = new f_sms();
fs.ShowDialog();
}

این خطا میده:
Exception has been thrown by the target of an invocation.

مشکلش کجاست؟

Sal_64
چهارشنبه 13 اردیبهشت 1391, 11:44 صبح
توضیحات بیشتر
همونطور که گفتم تابع ارسال sms خودش از چند تا تابع دیگه تشکیل شده بود
الان تبدیلش کردم به یک تابع واحد و
تابع ارسال تا جای ممکن از عناصر اضافه خالی کردم
الان یدونه متغییر عمومی - یدونه UC و یدونه کامپوننت kylix داخلش وجود داره
دوستان می تونن راهنمایی کنن

تشکر

Sal_64
پنج شنبه 14 اردیبهشت 1391, 09:45 صبح
دوستان چقد احتمال میدین ، این خطا بخاطر استفاده از کامپوننت kylix در تابع ارسال sms باشه :متفکر:
چه راهکاری به ذهنتون میرسه
تشکر :بوس:

Sal_64
سه شنبه 19 اردیبهشت 1391, 08:17 صبح
برنامه تریس کردم

روی این خط کد

Invoke(new MethodInvoker(delegate { send_gsm_sms(); }));
قبل از اینکه این خطا بده
Exception has been thrown by the target of an invocation

کامپوننت kylix پیغام خطایی میده با این مضمون
ERR_LOCATION_EMPTY

دوستان میتونن راهنمایی کنن :افسرده:
تشکر

tooti98
جمعه 22 اردیبهشت 1391, 17:40 عصر
سلام
میخواستم بپرسم دوستانی که از کامپوننت kylix استفاده میکنن اونو چطوری تهیه کردن؟ و اینکه اگه از خود سایت www.kylix.com گرفتن، چطور کرکش کردن ؟
احتمالا درخواست من به این پست ربطی نداره:لبخند:
با این حال اگه میتونین یه راهنمایی بکنین ممنونتون میشم
با تشکر از تمام بچه هایی که دانششون رو بی هیچ توقعی در اختیار هموطنانشون میزارن

Sal_64
یک شنبه 24 اردیبهشت 1391, 17:48 عصر
سلام
میخواستم بپرسم دوستانی که از کامپوننت kylix استفاده میکنن اونو چطوری تهیه کردن؟ و اینکه اگه از خود سایت www.kylix.com (http://www.kylix.com) گرفتن، چطور کرکش کردن ؟
احتمالا درخواست من به این پست ربطی نداره:لبخند:
با این حال اگه میتونین یه راهنمایی بکنین ممنونتون میشم
با تشکر از تمام بچه هایی که دانششون رو بی هیچ توقعی در اختیار هموطنانشون میزارن

سلام
اوهوم ربطی نداره :لبخند:
دقیق خاطرم نیست از کجا اوردم
ببین این ک.رک شده است یا نه (http://freecomponents.blogfa.com/post-96.aspx)
موفق باشی

tooti98
سه شنبه 26 اردیبهشت 1391, 20:09 عصر
سلام
مرسی نگاه کردم اینم کرک شده نیس:گریه:
بهر حال ممنونم

tooti98
سه شنبه 26 اردیبهشت 1391, 20:43 عصر
سلام دوستان میشه در مورد دلیل بلوکه شدن کدها در رویدادهایی از کامپوننت kylix مثل رویداد NewDeliveryReport بحث کنید
من خودم موقع تریس کردن کدهایی که داخل رویداد NewDeliveryReport نوشته بودم متوجه شدم که به محض رسیدن کامپایلر به کدهایی که من نوشتم دیگه عملا متوقف میشه وبه خط بعد نمیره(یه جورایی هنگ میکنه)
کسی از دوستان دلیل این مسئله رو میدونه؟
باتشکر

Sal_64
پنج شنبه 28 اردیبهشت 1391, 17:11 عصر
سلام دوستان میشه در مورد دلیل بلوکه شدن کدها در رویدادهایی از کامپوننت kylix مثل رویداد NewDeliveryReport بحث کنید
من خودم موقع تریس کردن کدهایی که داخل رویداد NewDeliveryReport نوشته بودم متوجه شدم که به محض رسیدن کامپایلر به کدهایی که من نوشتم دیگه عملا متوقف میشه وبه خط بعد نمیره(یه جورایی هنگ میکنه)
کسی از دوستان دلیل این مسئله رو میدونه؟
باتشکر

آیا کد خاصی اونجا قرار دادی ؟

tooti98
جمعه 29 اردیبهشت 1391, 02:16 صبح
با سلام

کدهای زیر رو داخل این رویداد نوشتم:
ID = db.Employs.Where(c => c.Mob == e.number).Select(c => c.ID).First();
PersianDate pd = new PersianDate(dt); PDate = pd.Year.ToString() + "\\" + pd.Month.ToString() + "\\" + pd.Day.ToString();
if (e.status == 1)
{
db.SaveMessage(ID, txtSMSText.Text, cmbTypeMsg.SelectedIndex.ToString(), true, dt, PDate);
}
else//consist of 2 and greater
{
db.SaveMessage(ID, txtSMSText.Text, cmbTypeMsg.SelectedIndex.ToString(), false, dt, PDate);
}

tooti98
جمعه 29 اردیبهشت 1391, 02:19 صبح
و هنگام تریس کردن دفیفا تو خط اول بلوکه میشه و دیگه ادامه نمیده.
با تشکر از لطفتون

Sal_64
شنبه 30 اردیبهشت 1391, 17:13 عصر
و هنگام تریس کردن دفیفا تو خط اول بلوکه میشه و دیگه ادامه نمیده.
با تشکر از لطفتون

میشه برای نمایش کدها از تگ کد استفاده کنید
و بگید خط اول قراره چه کاری انجام بده

faravaghi
چهارشنبه 03 خرداد 1391, 04:51 صبح
سلام گرامی،
این تقریبا کدی هست که من برای ارسال استفاده می کنم. با یخورده تغییر می تونید بومی سازیش کنید و تو برنام خودتون ازش بهره ببرید.

هرکجا که ناخوانا بود بفرمایید تا توضیخات لازم رو بدم. البته قابل ذکره که من از دو طریق وب و GSM ارسال دارم، برای همینه که قبل هر چی اینو بررسی میکنم که بدونم کاربر قراراه با کدوم یکی بفرسته.

دوتا تابع آخر هم برای اینه که شما در زمان اجرای BackgroungWorker اجازه نوشتن در Textbox, Button رو ندارید برای همین باید از اینا برای این کار استفاده کنید(از تغییر متن بگیرید تا تغییر عکس روی دکمه و....)

protected internal BackgroundWorker BgSend;

protected internal void SetBackgroundWorker()
{
try
{
// Get your configuration:
// Check Configuration IF Send Device Is GSM Modem:
// The configure is a Object that store My Programm Setting
if (configure.DeviceSend == Config.SendDevice.GSM)
{
if (BgSend == null)
{
BgSend = new BackgroundWorker();
this.BgSend.WorkerReportsProgress = true;
this.BgSend.WorkerSupportsCancellation = true;
this.BgSend.DoWork += new System.ComponentModel.DoWorkEventHandler(this.Send Progress);
this.BgSend.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandl er(this.SendCompleted);
this.BgSend.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler( this.ShowReportStatus);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void SendMassage(object sender, EventArgs e)
{
SetBackgroundWorker();

if (BgSend.IsBusy)
{
MessageBox.Show(". لطفا تا اتمام ارسال پيام هاي قبلي صبر نماييد");
return;
}
/***********
*
* Set Your Parameters
*
***********/

BgSend.RunWorkerAsync();
}

private void SendProgress(object sender, DoWorkEventArgs e)
{
try
{
configure.GetSetting();

if (configure.DeviceSend == Config.SendDevice.GSM && SignalQuality() <= 0)
{
e.Cancel = true;
WriteToBgWorker(BtnSendCancel, "عدم سرويس دهي");
return;
}

/***********
*
* Here You Can Write Your Code For Send SMS With GSM Modem
*
***********/


/***********
*
* Check If Operation Cancel By User, Cancel BackgroundWorker
*
***********/
if (BgSend.CancellationPending)
{
e.Cancel = true;
WriteToBgWorker(BtnSendCancel, "شروع مجدد ...");
return;
}

/***********
*
* For Showing Progress
*
***********/
BgSend.ReportProgress((indexSend* 100) / (MobileCount) , "Working...");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void SendCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
if (e.Cancelled)
{
/***********
*
* Write Your Code For Cancelling
*
***********/
}
else if (e.Error != null)
{
/***********
*
* Write Your Code For Error
*
***********/
}
else
{
/***********
*
* Write Your Code For Success
*
***********/
}
}
catch { }
}

private void ShowReportStatus(object sender, ProgressChangedEventArgs e)
{
try
{
Progressbar1.PerformStep();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void WriteToBgWorker(TextBox Tbox, string text)
{
if (Tbox.InvokeRequired)
{
Tbox.Invoke(new MethodInvoker(delegate { Tbox.Text = text; }));
}
}

private void WriteToBgWorker(Button Btn, string text)
{
if (Btn.InvokeRequired)
{
Btn.Invoke(new MethodInvoker(delegate { Btn.Text = text; }));
}
}

Sal_64
یک شنبه 18 تیر 1391, 21:01 عصر
سلام آیا عاقلانست که ما بین هر ارسال پیامک توسط gsm ، وقفه چند ثانیه ای قرار داد آیا باید داخل backgroundworker از تابع sleep هم استفاده کرد؟ این کار به سرعت برنامه لطمه ای وارد نمی کنه و یا باعث توقفش نمیشه ؟ تشکر

faravaghi
دوشنبه 19 تیر 1391, 10:19 صبح
سلام دوست عزیز،
اتفاقا به نظر من این کار لازمه و حداقل وقفه و معقولش همین 2 و یا 3 ثانیه است.
این وقفه به GSM به اصطلاح یه فرصت نفس کشیدن میده برای اینکه پورت رو خالی نگه میداره که اگه تو اون لحظه یه رویداد بخواد انجام بشه اینکار اتفاق بیافته. مثلا بخواد تایید ارسال(Delivery) یک پیام بیاد و یا شایدم یه پیام جدید باشه.

برای سوال دومی که فرمودین باید عرض کنم که حتما روی سرعت ارسال شما تاثیر گذار است!
مثلا شما 100 تا پیام دارین که بین هر کدوم از اونا 3 ثانیه وقفه ایجاد کردین. یه حساب کتاب سر انگشتی اگه بکنید 300 ثانیه به زمان ارسال اضافه شده که میشه 5 دقیقه!
پس زمان کمی نیست. ولی باید ببینید این زمان در کل ارزش دارد یا نه!
اگه از من میشنوید این آیتم رو اختیاری کنید و مدت زمان اونم از کاربر بگیرید تا خودش بدونه و اتلاف وقتش!

سایه عالی مستدام

tooraj_azizi_1035
دوشنبه 19 تیر 1391, 10:49 صبح
سلام
BackgroundWorker خودش بیانگر یک نخ جداگانه است. send_gsm_sms(); رو چرا در رویداد DowWork مستقیماً صدا نمی زنی؟
می دونی که قبلش هم باید RunWorkerAsync() رو صدا بزنی.
How to: Use a Background Worker (http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx)

Sal_64
دوشنبه 19 تیر 1391, 11:08 صبح
سلام تشکر آیا بهترین گزینه برای ایجاد وقفه تابع sleep ؟ و سوال بعد gsm در هر لحظه فقط و فقط توانایی انجام یک کار داره، یعنی اگه در زمان ارسال ، گزارش تسلیم (deliver) بیاد ، gsm از دلیور چشم پوشی میکنه و رویداد دریافت دلیور kylix روحشم خبردار نمیشه؟! لطف عالی پایدار

Sal_64
چهارشنبه 21 تیر 1391, 20:47 عصر
سلام
BackgroundWorker خودش بیانگر یک نخ جداگانه است. send_gsm_sms(); رو چرا در رویداد DowWork مستقیماً صدا نمی زنی؟
می دونی که قبلش هم باید RunWorkerAsync() رو صدا بزنی.
How to: Use a Background Worker (http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx)

سلام من با کمک این لینک برنامم تغییر دادم. اما در زمان ارسال خطای -بسته بودن پورت- میده. در حالیکه بدون backgroundworker پیامک ها ارسال میشه. -- در ضمن من عمل کانکت شده در خارج از BGW انجام میدم. اینم کد ارسال. (تگ کد کار نمی کرد!) private void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; if ((worker.CancellationPending == true)) { e.Cancel = true; } else { Invoke(new MethodInvoker(delegate { send_gsm_sms(); })); } }

Sal_64
چهارشنبه 04 مرداد 1391, 18:00 عصر
سلام . من برای توقف ارسال(bgw) از این کد استفاده می کنم . اما تا زمان ارسال پیامک برای تمام شمارها توقفی رخ نمیده و در پایان اعلام میکنه done. دوستان میتونن راهنمایی کنن؟؟ تشکر bw.CancelAsync();

araz_pashazadeh
دوشنبه 22 آبان 1391, 16:00 عصر
دوست عزیز اگه تکه کد را در قالب یک برنامه قرار بدین ممنون میشم چون من از هر کامپوننتی که شما بگین استفاده کردم یا درست نبودن یا مشکل رجیستری داشتن.
ممنون میشم اگه بصورت یک برنامه در اختیار من و دوستان قرار بدین