ورود

View Full Version : سوال: چگونگي رفع وقفه هاي به وجود آمده در برنامه



mbf5923
سه شنبه 14 دی 1389, 11:32 صبح
سلام
بعضي از اوقات در برنامه وقتي يك دستور اجرا ميشه و اون دستور طول بكشه تا نتيجه رو بازگرداني كنه برنامه كاملا قفل ميمونه.
به عنوان مثال يكي از كارهايي كه اين امر به طور كامل مشهود هستش ارتباط با بانك هاي داخل شبكه هست كه تا ارتباط با بانك برقرار بشه و اطلاعات خوانده و در برنامه نمايش داداه بشه برنامه قفل ميكنه.
البته اين يكي از جاها بود كه اين مشكل بوجود مياد.
سوال بنده اين هست چطور ميشه اين وقفه رو رفع كرد يعني در طول اجراي يك دستور برنامه ما اون چند لحظه رو قفل نكنه؟

pirmard
سه شنبه 14 دی 1389, 12:47 عصر
سلام
بعضي از اوقات در برنامه وقتي يك دستور اجرا ميشه و اون دستور طول بكشه تا نتيجه رو بازگرداني كنه برنامه كاملا قفل ميمونه.
به عنوان مثال يكي از كارهايي كه اين امر به طور كامل مشهود هستش ارتباط با بانك هاي داخل شبكه هست كه تا ارتباط با بانك برقرار بشه و اطلاعات خوانده و در برنامه نمايش داداه بشه برنامه قفل ميكنه.
البته اين يكي از جاها بود كه اين مشكل بوجود مياد.
سوال بنده اين هست چطور ميشه اين وقفه رو رفع كرد يعني در طول اجراي يك دستور برنامه ما اون چند لحظه رو قفل نكنه؟

علت اصلی این مشکل اینه که برنامه شما نمی تونه به ایونت های دیگه جواب بده در اون زمان . مثلا شما در حین یه عمل سنگین (که به قول شما برنامه قفل می کنه) روی یک چک باکس کلیک می کنین ولی اون چک باکس عکس العمل نشون نمی ده چون ایونت کلیک کردن رو دریافت نکرده . و مثلن ممکنه صفحه برنامه تون سفید بشه !!
در این مواقغ دستور do events رو می تونین استفاده کنین که البته معمولا زیاد توصیه نمیشه (سرعت برنامه رو کاهش میده)
راه درست و درمونش استفاده از ترد هاست

mbf5923
سه شنبه 14 دی 1389, 12:58 عصر
استفاده از event گاهي اوقات برنامه رو غيرقابل بازگشت ميكنه
يعني به طور دايم تا بسته شدن و باز شدن دوباره از كار ميفته.
از اين تريد چطوري بايد استفاده كرد؟
قبلا در موردش شنيدم اما روش استفده ازشون رو نميدونم.
اگه امكان داره توضيح بدين

pirmard
سه شنبه 14 دی 1389, 13:12 عصر
استفاده از event گاهي اوقات برنامه رو غيرقابل بازگشت ميكنه
يعني به طور دايم تا بسته شدن و باز شدن دوباره از كار ميفته.


متوجه این قسمت نشدم . میشه یه مثال بزنین
//////
ویژوال بیسیک 6 به صورت دیفالت از مولتی تردینگ پشتیبانی نمی کنه . یه سری دردسرهایی داره کار کردن با تردها تا جایی که من یادمه (مگراینکه از 3-4 سال پیش تا الآن راه حلی براش پیدا شده باشه)
فقط یادمه برنامه هایی رو که به صورت مولتی ترد می نوشتم رو اگه توی محیط خود ویژوال بیسیک run می کردیم (مثلا با f5 زدن) باعث می شد کلا" همه چی بسته بشه ! کرش می کرد و راه تست کردنش این بود که هر بار به جای اجرای برنامه ، از برنامه فایل اگزه بسازیم و اون فایل اگزه رو اجرا کنیم ! که دیباگ کردن و ... خیلی سخت می شد در این حالت .
انیوی اینجا رو یه نگاه بندازین ببینین به کارتون میاد مولتی تردینگ یا نه

http://www.freevbcode.com/ShowCode.asp?ID=1287

mbf5923
سه شنبه 14 دی 1389, 13:27 عصر
در استفاده و همزمان سازي event ها به صورت كد نويسي اين كار گاهي منجر به اين ميشه كه در بعضي مواقع پروسه برنامه به صورت كامل غير فعال بشه و برنامه پيغام not responding صادر كنه

pirmard
سه شنبه 14 دی 1389, 14:00 عصر
در استفاده و همزمان سازي event ها به صورت كد نويسي اين كار گاهي منجر به اين ميشه كه در بعضي مواقع پروسه برنامه به صورت كامل غير فعال بشه و برنامه پيغام not responding صادر كنه

«ه دیگه ! این حالت زمانی پیش میاد که برنامه شما درگیر باشه (مثلا توی یک حلقه باشه) و یک ایونت رخ بده ! که برنامه تا اون حلقه تموم نشه به اون ایونت نمی رسه و این باعث میشه که به قول شما برنامه موقتا به صورت نات رسپاندینگ در بیاد
حالا اگه برای اون حلقه از دستور do events استفاده کنین چنین اتفاقی نمیفته .

برای مثال این کد رو ببینین :


Private Sub Command3_Click()

For i = 1 To 100000

Me.Caption = i
Next
End Sub


در این مثلا شما در صول اجرای حلقه نمی تونین فرم رو جابجا کنین !

اما اگه کد رو به این صورت تغییر بدین درست میشه


Private Sub Command3_Click()

For i = 1 To 100000
DoEvents
Me.Caption = i
Next
End Sub

Slytherin
سه شنبه 14 دی 1389, 23:25 عصر
من قبلا یک برنامه نوشتم و در قسمتی از برنامه لازم بود که من از اینترنت چیزی رو دانلود کنم، مشکلی که وجود داشت این بود که برنامه قفل می کرد.
برای حل این مشکل من از یک روش ساده استفاده کردم، برنامه ای دیگر نوشتم که فقط مخصوص دانلود چیز مورد نظر باشد و خاصیت visible اون نیز false باشه، بعد فقط از برنامه اصلی برنامه جانبی رو صدا می زدم و اینطوری در حالی که داشت فایل مورد نظر دانلود می شد، برنامه هم قفل نمی کرد.
فکر می کنم از این روش بشه در جاهای دیگه هم استفاده کرد....

mbf5923
چهارشنبه 15 دی 1389, 10:30 صبح
اين روش كه شما فرموديد در بعضي جاها قابل استفاده است
ولي در بعضي جاها مثل خواندن بانك اطلاعاتي تحت شبكه فكر نكنم بشه ازش استفاده كرد.

mbf5923
جمعه 17 دی 1389, 11:46 صبح
از دوستان كسي روش ديگه اي به ذهنش نميرسه؟

Slytherin
جمعه 17 دی 1389, 12:23 عصر
اين روش كه شما فرموديد در بعضي جاها قابل استفاده است
ولي در بعضي جاها مثل خواندن بانك اطلاعاتي تحت شبكه فكر نكنم بشه ازش استفاده كرد.

شدن رو که می شه (خواندن بانك اطلاعاتي تحت شبكه) ولی خب یکم دردسر داره.
روشش هم اینه که یک برنامه جداگانه اطلاعات را ار بانک اطلاعاتی بخواند و سپس از طریق توابع API بین دو برنامه ارتباط برقرار کنید...
البته بعید می دونم این روش راه حل منطقی باشد!

Slytherin
جمعه 17 دی 1389, 12:36 عصر
از دوستان كسي روش ديگه اي به ذهنش نميرسه؟

یک چیز الان به ذهنم رسید حالا نمی دونم منطقی هست یا نه ولی فکر کنم عملی باشد.
همانطوری که قبلا گفتم شما می توانید از دو برنامه مجزا استفاده کنید اما اینطوری باید با روش های نسبتا دشوار بین دو برنامه ارتباط برقرار کنید،
برای حل این موضوع راه حلی دارم:
1.ابتدا برنامه ای طراحی کنید که اطلاعات را از بانک شبکه بخواند.
2.برنامه مذکور اطلاعات را به یک بانک محلی واسطه انتقال دهد.
3.برنامه اصلی اطلاعات را بخواند.

برای ارسال اطلاعات هم به مشابه بالا به این روش عمل کنید:
1.برنامه اصلی اطلاعات را وارد بانک واسطه محلی کند.
2.برنامه جانبی اطلاعات را از بانک واسطه بخواند.
3.برنامه جانبی اطلاعات را به بانک اصلی منتقل کند.

البته تمام اینها فرضیه هستند و تا زمانی که دقیقا ندانیم که چه اطلاعاتی باید منتقل شوند و اطلاعات چه چیز هایی هستند دقیق نمی توان نظر داد، اما به طور کلی فکر می کنم این روش جواب بدهد.

mbf5923
جمعه 17 دی 1389, 18:37 عصر
خوب بانك اصلي ما كه حجمش زياده و ما به همش احتياج نداريم بعضي اطلاعات رو ميخواهيم
حالا فرض كنيم كاربر بخواد يك استعلام از ديتابس بكنه با يك شرط خاص
اونوقت با اين روش مشكل پيدا ميكنه.چون ممكنه ما اون اطلاعات رو به بانك واسط واكشي نكرده باشيم.