PDA

View Full Version : دسترسی به اجزای برنامه در BackgroundWorker



aghayex
سه شنبه 24 خرداد 1390, 20:38 عصر
دوستان من در یه برنامه برای اینکه هنگام اجرای دستور یه ماسک نمایش داده بشه و برنامه هم قفل نکنه از ترد یا BackgroundWorker استفاده کردم که توو هر دوی اونها موقع اجرا به کد هام گیر می ده و می گه نمی تونم به اشیای فرم دسترسی داشته باشم چون اونها در یه ترد دیگه هستن
حالا از دوستان می خواستم که ببینند مشکل چیه ؟

محسن شامحمدی
چهارشنبه 25 خرداد 1390, 11:20 صبح
حالا از دوستان می خواستم که ببینند مشکل چیه ؟
مشکلی وجود نداره و این یک چیز عادیه.
می تونید از دوراه حلش کنید:


Private Sub SaveData(ByVal filepath As String)
If InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf SaveData))
else
'run your codes here
End If
End Sub



یا

control.checkforillegalcrossthreadcalls=false

aghayex
چهارشنبه 25 خرداد 1390, 14:29 عصر
دسدتون درد نکنه اما من چیزی ازش نفهمیدم
فرض کنید که من اومدم یه تابع در یه ترد فراخوانی کردم که در اون تابع از یه textbox استفاده شده

محمد باقری نسب
چهارشنبه 25 خرداد 1390, 14:49 عصر
اگه شما میخوای فقط به قول خودت یه ماسک (که من منظورت رو درست نگرفتم و فکر کنم یه مثلا "چند لحظه منتظر بمانید" هست) میتونی پس از نمایش دادن ماسکت کد زیر رو فراخوانی کنی و بعد عملیاتت رو انجام بدی.

System.Windows.Forms.Application.DoEvents()

و یا اینکه اگر زمان انجام عملیات خیلی طول میکشه با استفاده از یه تایمر پشت سر هم این تابع رو فراخوانی کن تا برنامت قفل نکنه!

aghayex
چهارشنبه 25 خرداد 1390, 19:25 عصر
من می خوام اجرای این تابع در یه ترد جداگانه صورت بگیره و اینم برام سواله تردی که نتونه به اجزای برنامه دسترسی داشته باشه به چه دردی می خوره ؟

Hossis
چهارشنبه 25 خرداد 1390, 20:30 عصر
دوستان من در یه برنامه برای اینکه هنگام اجرای دستور یه ماسک نمایش داده بشه و برنامه هم قفل نکنه از ترد یا BackgroundWorker استفاده کردم که توو هر دوی اونها موقع اجرا به کد هام گیر می ده و می گه نمی تونم به اشیای فرم دسترسی داشته باشم چون اونها در یه ترد دیگه هستند.
من می خوام اجرای این تابع در یه ترد جداگانه صورت بگیره و اینم برام سواله تردی که نتونه به اجزای برنامه دسترسی داشته باشه به چه دردی می خوره ؟

این سوال من هم هست
اگه جوابی پیدا بشه خیلی خوبه

Navid Asadi
جمعه 27 خرداد 1390, 14:37 عصر
فکر کنم بدونم چه طور حل می شه:
البته مطمئن نیستم...
شما باید کنترل رو به صورت اشتراکی تعریف کنید یعنی مثل :

Friend Shared WithEvents txt As System.Windows.Forms.RichTextBox

که البته این باید در designer فرم تعریف بشه و البته خود ترید هم باید به همین شکل : public shared تعریف بشه البته بعد هر تابع یه sub یا ... که بخواد از اون استفاده کنه باید shared باشه ....

به احتمال 99 درصد حل میشه....

محسن شامحمدی
شنبه 28 خرداد 1390, 12:06 عصر
من می خوام اجرای این تابع در یه ترد جداگانه صورت بگیره و اینم برام سواله تردی که نتونه به اجزای برنامه دسترسی داشته باشه به چه دردی می خوره ؟

دلیلش اینه که ویندوز به شما اجازه نمی ده به اشیایی که توی یک ترد دیگه ساخته شدن دسترسی داشته باشین.
بلکه باید این درخواست رو به تردی که این اشیا رو تولید کرده بدید.
تمامی کنترل هایی که روی فرم می کشیم توی ترد اصلی یا Main Thread ساخته می شن.
به همین دلیله که شما در حالت عادی اجازه ندارین از ترد خودتون با اشیایی که توی ترد اصلی ساخته شدن ارتباط برقرار کنید

Hossis
شنبه 28 خرداد 1390, 20:18 عصر
دلیلش اینه که ویندوز به شما اجازه نمی ده به اشیایی که توی یک ترد دیگه ساخته شدن دسترسی داشته باشین.
بلکه باید این درخواست رو به تردی که این اشیا رو تولید کرده بدید.
تمامی کنترل هایی که روی فرم می کشیم توی ترد اصلی یا Main Thread ساخته می شن.
به همین دلیله که شما در حالت عادی اجازه ندارین از ترد خودتون با اشیایی که توی ترد اصلی ساخته شدن ارتباط برقرار کنید
با این وضع، راه حل چیه؟؟

Hossis
چهارشنبه 01 تیر 1390, 20:53 عصر
در صورت امکان یکی جواب این سوال را بدهد

aghayex
جمعه 03 تیر 1390, 22:59 عصر
دوستان که در این مورد کار کردن راهنمایی کنن:عصبانی++:

Hossis
جمعه 03 تیر 1390, 23:26 عصر
همین کد رو در Form_Load بنویسید مشکل حل میشه
me.checkforillegalcrossthreadcalls=false