PDA

View Full Version : مشکل با backgroundworker



Mrs.Net
یک شنبه 15 مهر 1386, 12:58 عصر
من در رویداد load فرمم یک بکگراند اجرا کردم که یک دیتاست پر میکنه و در قسمت کامل شدن این بکگراند دستور برای فعال کردن کلیدهام گذاشتم
اما وقتی فرم بسته میشه سیستم هنگ میکنه!
مشکل چیه؟

hassan razavi
یک شنبه 15 مهر 1386, 13:36 عصر
من منظورتون را درست متوجه نشدم.
یعنی وقتی فرم لود میشه مشکلی ندارید و برنامه اجرا میشه و dataset هم پر میشه و برنامه کار میکنه تا زمانی که فرم را Close کنید؟
یا از هموم اول قبل از نمایش فرم برنامه هنگ میشه؟

babak23
یک شنبه 15 مهر 1386, 15:18 عصر
اگه امکانش هست کد برنامه را داخل سایت بزارید فکر کنم سریعتر به نتیجه برسید

PC2st
یک شنبه 15 مهر 1386, 16:41 عصر
اما وقتی فرم بسته میشه سیستم هنگ میکنه!
سیستم هنگ (hang up) میکنه یا اینکه برنامه خاتمه پیدا نمیکنه؟
اگر با close کردن فرم، برنامه خاتمه پیدا نکنه، به احتمال زیاد یک thread هنوز داره کار میکنه و کارش هنوز تموم نشده (شاید هم هیچوقت تموم نشه!) در اینصورت thread هایی که در طول برنامه ایجاد شده رو debug کنید.

Mrs.Net
دوشنبه 16 مهر 1386, 12:11 عصر
در اینصورت thread هایی که در طول برنامه ایجاد شده رو debug کنید.
برنامه هنگ میکنه و این احتمال هست که حرف شما درست باشه.
چجوری ببینم کدام ترد تموم نشده؟

PC2st
دوشنبه 16 مهر 1386, 19:42 عصر
چجوری ببینم کدام ترد تموم نشده؟
دو راه به ذهنم میرسه:

1. بعد از خروج از برنامه، هر گاه برنامه خارج نشد (و به اصطلاح هنگ کرد)، از نوار ابزار Debug روی Break All کلیک کنید (یا کلیدهای Ctrl+Alt+Break رو فشار دهید). در اینصورت کنترل اجرای برنامه متوقف میشه و مشخص میشه که برنامه در حال حاضر داره کدوم Thread رو اجرا میکنه.

2. اشکال روش اول در این هست که براحتی نمیشه تشخیص داد که آن قسمت از برنامه مربوطه به کدام Thread هست، و راه بهتر اینه که برای هر Thread یک نام اختصاص بدهید، اصولا اختصاص دادن یک نام برای هر Thread میتونه Debug کردن برنامه های Multithread رو راحت تر کنه. برای اختصاص دادن یک نام برای یک thread:


th.Name = "HELLO";

th یک شیئ از نوع Thread است.
حال که یک نام برای th مشخص شد، برنامه رو اجرا کنید و در زمانی که برنامه در حال اجراست، از منوی Debug گزینه Windows و سپس Thread رو انتخاب کنید، با اینکار، هر وقت که برنامه هنگ کرد، به روش مورد 1، برنامه رو Pause کنید (کلید Ctrl+Alt+Break)، سپس اگر به پنجره Thread نگاه کنید، متوجه میشوید که اون قسمت از کد مربوط به کدام Thread است چون نام HELLO را برای اون Thread مشخص کرده اید. در واقع حالت 2، کاملتر از حالت 1 بود.

Mrs.Net
سه شنبه 17 مهر 1386, 15:41 عصر
اما من از هیچ تردی که خودم ساخته باشم استفاده نکردم.
یک فرم ساده که بیندینگ سورس داره و فقط قسمت پر شدن دیتاست داخل بکگراندورکر هست.

PC2st
سه شنبه 17 مهر 1386, 22:11 عصر
اما من از هیچ تردی که خودم ساخته باشم استفاده نکردم.
اگر مطمئن هم هستید که کار BackgroundWorker تموم میشه، یعنی اون BackgroundWorker باعث هنگ شدن میشه. برای مطمئن شدن، BackgroundWorker رو از فعالیت بندازید و برنامه رو اجرا کنید، آیا دوباره هنگ میکنه؟ اگر اینطور باشه پس مشکل از جای دیگه است.
در رویداد FromColsing یا FromClosed کار بخصوصی که انجام نمیدید؟

Mrs.Net
چهارشنبه 18 مهر 1386, 01:34 صبح
اگر مطمئن هم هستید که کار BackgroundWorker تموم میشه، یعنی اون BackgroundWorker باعث هنگ شدن میشه. برای مطمئن شدن، BackgroundWorker رو از فعالیت بندازید و برنامه رو اجرا کنید، آیا دوباره هنگ میکنه؟ اگر اینطور باشه پس مشکل از جای دیگه است.
نه هنگ نمیکنه و فقط درحالتی که از بکگراند استفاده میکنم هنگ میکنه
فکر کنم از یکی از بیندینگها باشه.
تو یک فرم دیگه همینکارو کردم و جواب داد اما بعداز پر کردن دیتاست
دیتاگرید خالی بود و وقتی روی یکی از ستونهاش کلید میزنم رکوردها نمایش میده!!
ممنون

PC2st
چهارشنبه 18 مهر 1386, 04:47 صبح
دیتاگرید خالی بود و وقتی روی یکی از ستونهاش کلید میزنم رکوردها نمایش میده!!
!؟ میتونید یک نمونه برنامه خیلی خیلی ساده رو ضمیمه کنید؟