PDA

View Full Version : مشکلی با گزارش BackgroundWorker



hamed jalili
دوشنبه 08 اسفند 1390, 17:01 عصر
با سلام ،

دوستان من از BackgroundWorker برای پیمایش یک درخت استفاده می کنم ، ساختار پیاده سازی این درخت به گونه است که برای هر عمق از درخت یک متغیر وجود دارد که مشخصا کننده Node ی است که در عمق های پایین تر در حال پردازش است .
از Report Progress برای نمایش این متغییر ها استفاده می کنم ( 3 متغیر وجود دارد به عبارتی عمق درخت 3 است )
مشکل در Report Progress مربوط به عمق 1 ( اولین عمق که در بعضی جاها عمق 0 هم به آن می گویند) درخت است . نحوه پیاده سازی ، عملکرد و گزارش گیری از هر سه متغیر کاملا یکسان است هنگام نمایش پیشرفت عمق 3 و 2 در یک Progressbar هیچ مشکلی پیش نمی آید ولی هنگام نمایش Progress مربوط به عمق 1 ، چند لحظه برنامه هنگ می کند ( مثلا 2 یا 3 ثانیه ) بعد پیشرفت عمق یک را نمایش می دهد و کار را با نمایش پیشرفت های عمق های 2 و 3 ادامه می دهد . البته بعد از آن مکث چند ثانیه ای کار نمایش از اولین مقدار مربوط به عمق 2 شروع نمی شود ( مثلا از 20% به بعد شروع می شود ) البته نه به این معنی که آن بازه ( زیر 20% ) پردازش نمی شود ، نه ، بلکه پیشرفت آن بخش نشان داده نمی شود .
:متفکر::متفکر:
باز هم تاکید میکنم پیاده سازی ، عملکرد ، نحوه گزارش گیری و نمایش گزارش در هر سه عمق کاملا یکسان است .

دوستان خیلی ممنون میشم اگر کسی راهنماییم کنه

مهدی فرزاد
سه شنبه 09 اسفند 1390, 07:42 صبح
سلام
میتونی یک نمونه بگذاری ببینم چه منطقی رو پیاده کردی؟

hamed jalili
سه شنبه 09 اسفند 1390, 12:22 عصر
کد خیلی بزرگ و پیچیده ایه ، ولی سعی کردم تا جایی که می تونم ساده کنم .

برای اجرای درخت ، Backgroundworker یک تابع از داخل یک کلاس اجرا میکند که متغیر هایی که مانیتور می شوند درون آن تابع تغییر میکنند .
آن تابع به صورت خیلی خلاصه شده به شکل زیر است :


while (Level_1())
{
A++;
while (Level_2())
{
B++;
while (Level_3())
{
C++;
}
}
}


در تابع اصلی برای گزارش گیری کار های زیر را انجام میدهم ( البته فقط یکی از متغیر های را اینجا گذاشتم )



public MainWindow()
{
InitializeComponent();
A_in_Process += new EventHandler<ValueEventArgs>(A_in_Process);
}



private void A_in_Process(object sender, ValueEventArgs e)
{
Reasoning_Background_Worker.ReportProgress(e.Value , "A Change");
}


private void Reasoning_Background_Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if(e.UserState != null)
switch (e.UserState.ToString())
{
case "A Change":
A_Progress_Bar.Value = e.ProgressPercentage;
A_Progress_Value.Text = (e.ProgressPercentage).ToString() ;
break;
}
}



کد رو خیلی ساده کردم ، با این وجود امیدوارم قابل فهم باشه .

رضا عربلو
دوشنبه 22 اسفند 1390, 11:03 صبح
در windows forms دستوری بود به نام DoEvents که به سیستم عامل فرصت می داد تا نفسی بکشد و به message هایی که در queue اش قرار دارد رسیدگی کند. در wpf این دستور وجود تدارد ولی می توان از معادل آن استفاده کرد. نمی دانم آیا این روش معادل در BackgroundWorker قابل استفاده است یا نه.
تست کنید و اطلاع دهید؟
http://barnamenevis.org/showthread.php?300364-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%D9%86%D8%A7%D9%BE%D8%AF%DB%8C%D8%AF-%D8%B4%D8%AF%D9%86-Grid&highlight=DoEvents
http://barnamenevis.org/showthread.php?155767-%DA%A9%D9%88%DA%86-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A7%D8%B2-win-%D8%A8%D8%A7-wpf-%D8%9F&highlight=DoEvents

محمدامین شریفی
پنج شنبه 03 فروردین 1391, 01:30 صبح
در windows forms دستوری بود به نام DoEvents که به سیستم عامل فرصت می داد تا نفسی بکشد و به message هایی که در queue اش قرار دارد رسیدگی کند. در wpf این دستور وجود تدارد ولی می توان از معادل آن استفاده کرد. نمی دانم آیا این روش معادل در BackgroundWorker قابل استفاده است یا نه.
تست کنید و اطلاع دهید؟
http://barnamenevis.org/showthread.php?300364-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%D9%86%D8%A7%D9%BE%D8%AF%DB%8C%D8%AF-%D8%B4%D8%AF%D9%86-Grid&highlight=DoEvents
http://barnamenevis.org/showthread.php?155767-%DA%A9%D9%88%DA%86-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A7%D8%B2-win-%D8%A8%D8%A7-wpf-%D8%9F&highlight=DoEvents

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx