PDA

View Full Version : سوال: Refresh شدن فرم



shahab2025
یک شنبه 24 آبان 1388, 15:19 عصر
سلام

من در برنامه ام دگمه اي دارم كه به سبب فعاليت سنگين بر روي ديتابيس ميشه .
مشكل اينجاست كه در هنگام شروع شدن فعاليت اگر فرم اصلي من فوكوس را از دست بده ديگه نميتونه به دست بياره تا زمانيكه يا end task بشه و يا فعاليت تمام شه.

اين مشكل را چطور حل كنم؟؟؟

ACorvinus
یک شنبه 24 آبان 1388, 17:06 عصر
سلام .

این فعالیت هایی که میگین به خاطر انجام عملیات رو Database هستش یا کدهای داخل برنامه ؟

اگه میشه لطف کنین بگین از کدوم Database استفاده می کنین ؟ SQL ؟

shahab2025
یک شنبه 24 آبان 1388, 22:39 عصر
این فعالیت هایی که میگین به خاطر انجام عملیات رو Database هستش یا کدهای داخل برنامه ؟

اگه میشه لطف کنین بگین از کدوم Database استفاده می کنین ؟ SQL ؟

سلام از sql استفاده میکنم و فعالیتها هم به خاطر sql است (عملیات روی DB)
مثلا یکی از اونها اینه که 13 تا دیتابیس باید پاک بشه و دوباره از جای دیگری restore بشه

ACorvinus
دوشنبه 25 آبان 1388, 10:30 صبح
مثلا یکی از اونها اینه که 13 تا دیتابیس باید پاک بشه و دوباره از جای دیگری restore بشه

دوست من اجرای دستورات SQL در محیط SQL خیلی سریع تر از اجرای اون در محیط هایی همچون Net. هستش .

برای مثال: واکشی 20 رکورد در محیط SQL شاید چندان تفاوتی با واکشی کردن این رکوردها با استفاده از دستورات SQL در محیط Net. نداشته باشه ولی وقتی تعداد این رکوردها میره بالاتر ( مثلا 100000 رکورد )، اونوقت تفاوت زمان اجرای دستورات محسوس میشه .

من در حد سواد خودم توصیه می کنم دستورات Drop کردن و Create کردن بر روی Database هاتون ( و هر عملی شبیه به اینا ) رو ببرین و تحت عنوان یه Stored Procedure در محیط SQL اجرا کنین سپس این SP رو از برنامه تون فراخوانی کنین .

قطعا سرعت اجرای دستوراتتون میره بالا .

اما در مورد از دست دادن Focus برنامه تون باید عرض کنم مشکل شما این نیست .
لطفا دستوراتتون رو در حالت Debug خط به خط اجرا کنین و ببینین برنامه شما در کدوم دستور به Loop می افته . من گمان نمی کنم به خاطر اجرای 100 خط Query برنامه شما Focus ش رو از دست بده .


موفق باشین .

مهدی نان شکری
دوشنبه 25 آبان 1388, 13:11 عصر
با سلام
بعضی عملیات وجود دارند که موقع اجرا UI برنامه به شکل stopped responding در میاد. و گاها ربطی به استفاده از Stored procedure هم نداره.
برای عملیات زمان بر مانند عملیات سنگین بر روی دیتابیس و یا هر عمل دیگر بهتره از کلاس BackgroundWorker بهره جست.
BackgroundWorker کلاسی هست که عملیات مشخص رو روی Thread جدا اجرا می کنه.
برای این منظور بهتره یک جستجو در سایت انجام دهید. یکی از دوستان قبلا یک مثالی رو نوشته بودند.
و یا به سایت زیر رجوع کنید.
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

Mani_rf
دوشنبه 25 آبان 1388, 13:47 عصر
با احترام به تمامی روش های ذکر شده در بالا این نکته را اضافه می نمایم که می توانید درون حلقه یا حلقه هایی که این عملیات سنگین را در برنامه تان انجام می دهند عبارت Application.DoEvents را اضافه نمایید تا به هنگام رسیدن کامپایلر به این عبارت ، به سایر قسمت های برنامه اجازه انجام عملیات بدهد؛ در نتیجه تا پایان اجرای کد های شما تمامی قسمت های برنامه به خوبی کار می کنند و با از دست دادن فکوس برنامه به حالت Not Responding نمی رود.
مثال :


[For I as integer = 0 to 10000
Application.DoEvents()
Next

مهدی نان شکری
دوشنبه 25 آبان 1388, 15:45 عصر
با سلام
بله حق با شماست.
در مواردی که ما از حلقه استفاده می کنیم با Application.DoEvents() برنامه به Event های برنامه هم پاسخ می دهد ولی در بعضی مواقع مثلا در هنگام Select زدن از دیتابیس برنامه تا زمان ازسال پاسخ کامل RDBMS در حالت منتظر خواهد ماند.

shahab2025
دوشنبه 25 آبان 1388, 21:46 عصر
مرسی از همه دوستان که سوادشون را با من share کردند.
مطمئن هستم فردا با این تغییرات در برنامه ام مشکل حل خواهد شد.
باز هم مرسی

ACorvinus
سه شنبه 26 آبان 1388, 10:10 صبح
با سلام
بله حق با شماست.
در مواردی که ما از حلقه استفاده می کنیم با Application.DoEvents() برنامه به Event های برنامه هم پاسخ می دهد ولی در بعضی مواقع مثلا در هنگام Select زدن از دیتابیس برنامه تا زمان ازسال پاسخ کامل RDBMS در حالت منتظر خواهد ماند.


آقای نان شکری من مخلص شما هستم، هرچی داریم از شماست .
تهران خوش بگذره .

آقای shahab2025 به نتیجه رسیدین ؟