PDA

View Full Version : فریز شدن فرم هنگام اجرای یک Thread



hamid_khakzad
جمعه 27 آذر 1388, 15:59 عصر
با عرض سلام خدمت دوستان و اساتید عزیز
من یک برنامه نوشتم که پیام چندرسانه ای(mms ) به صورت گروهی ارسال می کنه
من این برنامه را با استفاده از یک کامپوننت نوشتم و متدی که کار ارسال را انجام می ده(یکی از متدهای خود کامپونت) داخل یک Thread نوشتم و وقتی این Thread اجرا می شه تا وقتی که کار متد ارسال تمام نشه فرم فریز می شه و نمی تونم کار دیگه ای انجام بدم
دوستان چه راه حلی پیشنهاد می کنند؟



PublicClass MMS


()PublicSub SendGroupMMS
(objMm1Protocol.Send(objMessage
EndSub


End

Class





Dim MMS_Sender1 AsNew MMS


Private Sub btnSendMMS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendMMS.Click

Dim StrStatus As String = MMS_Sender1.AddRecip()

If StrStatus = "Ready" Then
Dim SendGroupThread As New System.Threading.Thread(AddressOf MMS_Sender1.SendGroupMMS)
SendGroupThread.IsBackground = True
SendGroupThread.Start()





End If

End Sub

hamid_khakzad
شنبه 28 آذر 1388, 00:15 صبح
واقعا کسی اینجا نیست که جواب سوال من را بده؟
من نیاز فوری دارم به راه حل این سوالم

DoDoklak
شنبه 28 آذر 1388, 10:35 صبح
شما بهتره که در این مورد از Thrat استفاده نکنید

نقل قول از پیامهای خصوصی

دوست عزیز انگار شما یه کم عجله داشتی و سوال من را کامل نخوندی
من MMS ارسال می کنم نه sms

نه من عجله نکردم منظور شما رو هم متوجه شدم
ولی هردوشون هم sms ,mms هر دو وابسته به سیستم مخابراتی هستند
اولا مطمئن شید که سیم کارت شما mms رو پشتیبانی میکنه یعنی سیستم مخابراتی بتونه mms ارسال کنه
دوما فرض کنید شما میخواهید یک mms رو برای 50 نفر همزمان بفرستید حالا با این برنامه شما همزمان 50 thrate رو فعال میکنید و همشونه هم درخواست ارسال رو به کامپونینت و یا دستگاه مربوطه میفرستند و این باعث هنگ سیستم تو کارهای زیاد میشه .درکل سیستمهای اینچنینی همزمانی رو پشتیبانی نمیکنن یعنی باید درخواست جاری را انجام بده بعد میره سراغ درخواست بعدی

hamid_khakzad
شنبه 28 آذر 1388, 12:41 عصر
شما بهتره که در این مورد از Thrat استفاده نکنید

نقل قول از پیامهای خصوصی


نه من عجله نکردم منظور شما رو هم متوجه شدم
ولی هردوشون هم sms ,mms هر دو وابسته به سیستم مخابراتی هستند
اولا مطمئن شید که سیم کارت شما mms رو پشتیبانی میکنه یعنی سیستم مخابراتی بتونه mms ارسال کنه
دوما فرض کنید شما میخواهید یک mms رو برای 50 نفر همزمان بفرستید حالا با این برنامه شما همزمان 50 thrate رو فعال میکنید و همشونه هم درخواست ارسال رو به کامپونینت و یا دستگاه مربوطه میفرستند و این باعث هنگ سیستم تو کارهای زیاد میشه .درکل سیستمهای اینچنینی همزمانی رو پشتیبانی نمیکنن یعنی باید درخواست جاری را انجام بده بعد میره سراغ درخواست بعدی
دوست عزیز من با ارسال mms مشکلی ندارم و به راحتی mms را به چندین نفر ارسال می کنم مشکل من این هست که موقع ارسال فرم اصلی برنامه Freeze می شه و نمی شه همزمان کار دیگه ای انجام داد
و در مورد ارسال به چندید نفر هم این نکته را خدمت شما عرض کنم که mms مثل sms نیست و می تونی یک mms را به چندیدن نفر دی یک لحطه ارسال کنی(دقیقا مثل ایمیل)
و در این صورت حرف شما صحیح نیست که برای ارسال به 50 نفر 50 ترد اجرا بشه و همون یه تردی که نوشتم این کار را انجام می ده
فقط می مونه مشکل فریز شدن فرم
از دوستان و اساتید حرفه ای کسی نیست که بتونه این مشکل را حل کنه؟

DoDoklak
شنبه 28 آذر 1388, 15:32 عصر
می تونی یک mms را به چندیدن نفر دی یک لحطه ارسال کنی(دقیقا مثل ایمیل)

اگر از اینترنت برای ارسال mms استفاده میکنید امکان پذیره ولی جهت استفاده از GSM Modem و یا گوشی موبایل بعید به نظر میرسه ! چون با استفاده از Threat اصلا فرم قفل نمیشه احتمالا در یک جایی از سورستون مشکل دارید


فقط می مونه مشکل فریز شدن فرم

برای این حالت هم میتونی از دستور

Application.DoEvent
استفاده کنید تا فرم بتونه خودشو نمایش بده و ازاد بشه

hamid_khakzad
شنبه 28 آذر 1388, 15:39 عصر
دوست عزیز اینکه مسلمه که mms با استفاده از اینترنت(GPRS) ارسال می شه
و در مورد application.doevent هم بگم کهع این دستور هیچ تاثیری تو برنامه من نداره و این دستور فقط تو loop ها یا همون حلقه ها تاثیر خودش را نشون می ده

DoDoklak
شنبه 28 آذر 1388, 16:25 عصر
اگر همه چی درسته پس شاید دیگه نشه کمکی کرد
چون همه چیز برمیگرده به نحوه عملکرد کامپونینت Kylix وشما هم دسترسی به سورس کامپونینت ندارید تا بخواهید بهینه بشه
البته باید تو این جور سیستمها شرایط سخت افزاری و محیطی رو هم در نظر بگیرید
من به شخصه از Kylix.SMS_ActiveX_Control_v5.0.5.1 استفاده میکنم کارش بد نیست که البته جدیدا نسخه Kylix.SMS_ActiveX_Control_v5.5 رو به بازار عرضه کرده شاید بهتر شده باشه
دو کامپونینت دیگه هم این کار رو میکنن که دست کمی از Kylix ندارند

اولیش که من باهاش کار کردم و سرعت خوبی هم داره
activexperts
از سایت زیر میتونید نمونه سورشو دانلود کنید
http://www.activexperts.com/xmstoolkit/howto/devs/#vcnet

مهدی نان شکری
یک شنبه 29 آذر 1388, 17:46 عصر
سلام دوست عزیز
راه حل مشکل شما استفاده از BackGroundWorker می باشد.
ببینید این مشکلتون رو حل می کنه؟
http://www.codeproject.com/KB/cs/yourownloadingclassbw.aspx
اگر باز هم موردی بود مطرح کنین.

DoDoklak
دوشنبه 30 آذر 1388, 08:44 صبح
روش استفاده از Threat مشکلي نداره ولي يک نکته وجود داره
فرض کنيد شماره ها 50 تا هستند و شما ميخوايد يک پیام تصویری رو براي همه بفرستيد
خوب شما اين 50 تا شماره رو يکجا با يک ترد اجرا ميکنيد
خوب مسلما فشار زيادي روي کامپونينت و سخت افزار مورد نظر مياد
به نظر من با توجه به گفته ساير دوستان در تاپيک بحث شده در اين مورد شما به ازاي هر شماره يک ترد ايجاد کن تا فشار کمتري بياد اينجوري فرم هم قفل نميشه


راه حل مشکل شما استفاده از BackGroundWorker می باشد.

استفاده از Threat همون کار BackGroundWorker انجام میده

hamid_khakzad
دوشنبه 30 آذر 1388, 08:51 صبح
روش استفاده از Threat مشکلي نداره ولي يک نکته وجود داره
فرض کنيد شماره ها 50 تا هستند و شما ميخوايد يک پیام تصویری رو براي همه بفرستيد
خوب شما اين 50 تا شماره رو يکجا با يک ترد اجرا ميکنيد
خوب مسلما فشار زيادي روي کامپونينت و سخت افزار مورد نظر مياد
به نظر من با توجه به گفته ساير دوستان در تاپيک بحث شده در اين مورد شما به ازاي هر شماره يک ترد ايجاد کن تا فشار کمتري بياد اينجوري فرم هم قفل نميشه


استفاده از Threat همون کار BackGroundWorker انجام میده
دوست عزیز فکر کنم شما حرفهای من یادت رفته
من که بهت گفتم با یک شماره هم همین جور هست
و ثانیا تعداد شماره ها هم که زیاد باشه ربطی نداره چون سیستم ارسال MMS با sms تفاوت داره و به این صورت هست که واسه ارسال ، پیام فقط به MMSC ارسال می شه و اینجوری نیست که پیام مستقیم به هر شخصی ارسال بشه و مثل ایمیل هست دقیقا
شما برای ارسال یک ایمیل به 10 نفر، 10 تا ایمیل ارسال می کنی؟

DoDoklak
دوشنبه 30 آذر 1388, 09:11 صبح
من که بهت گفتم با یک شماره هم همین جور هست


فکر نکنم اینو قبلا گفته باشی

خوب اگر برای یک شماره و 50 تا شماره دقیقا به یک صورت عمل میکنه یا کامپونینت مربوطه خیلی بد عمل میکنه و یا واقعا ارسال mms به کندی انتقال پیدا میکنه(به خاطر مشکلات سخت افزاری و یا محیطی)
شما سعی کن نمونه سورس خود سازنده کامپونینت رو امتحان کن ببین اونجا هم به همین کندی
اگر سورشو نداری از سایت زیر بگیر

http://www.activexperts.com/xmstoolk...to/devs/#vcnet

ولی حالا از کندی ارسال بگذریم مشکل قفل شدن فرم نرمال نیست چون با استفاده از Threat نباید این اتفاق بیفته .ورودی های مورد استفاده Threate و همچنین کلاسهای ارسال MMS همگی رو فرم قرار دارند و اونجا تعریف شدند و با اجرای Threat هر چند که مستقل باشه ولی برای اجرا بازم نیاز به آبجکتهای تعریف شده در فرم داره سعی کن این آبجیکتها رو وابسته به فرم نکنی .این مورد رو امتحان کن ببین حل میشه

hamid_khakzad
دوشنبه 30 آذر 1388, 10:06 صبح
ای ول پسر گل گفتی
من هنوز تست نکردم ولی 99 % احتمال می دهم مشکل از همین باشه
ببین من یه آبجکت به نام objMessege و این آبجکت یه سری property داره که با استفاده از تکست باکس هایی که روی فرم هست مقدار دهی می شه به این صورت:




objMessage.From = MainForm.txtFrom.Text
objMessage.Subject = MainForm.txtSubject.Text
(objMessage.AddSlide(objSlide


البته این نکته را هم عرض کنم که این کار در یک روال دیگه انجام می شه ولی من فکر کنم ربط داشته باشه چون متدی که پیام را ارسال می کنه از همین آبجکت استفاده می کنه به این صورت:



(objMm1Protocol.Send(objMessage