PDA

View Full Version : استفاده از dll های آماده در Thread



MRasoul
چهارشنبه 29 بهمن 1393, 09:53 صبح
سلام به همه
من یه تابع دارم که داخلش از یک dll آماده استفاده کردم و خیلی هم خوب جواب میده و فقط مشکل زمانی پیش میاد که این تابع رو با Thread فراخوانی میکنم و پیغام زیر رو میده
البته میدونم دلیل خطا برا اینه که این dll توی thread اصلی وجود داره ام خب
راه حلش چیه؟
128591

MRasoul
چهارشنبه 29 بهمن 1393, 10:24 صبح
با استفاده از

my_thread.SetApartmentState(ApartmentState.STA);
فعلا حل شد
اما یه مشکل کوچیک هست،ببینم حل میشه یا نه

plus
چهارشنبه 29 بهمن 1393, 17:26 عصر
اگه کامپوننت مورد نظر مستقیما با User Interface در ارتباط باشه شما نباید متدهای اون رو در Thread دیگه ای جز Thread اصلی (UI) فراخوتانی کنید.

MRasoul
پنج شنبه 30 بهمن 1393, 06:59 صبح
ینی الان این کدی که گفتم استفاده کردم و فعلا جواب میده، مشکل ساز میشه؟

SabaSabouhi
پنج شنبه 30 بهمن 1393, 08:52 صبح
ینی الان این کدی که گفتم استفاده کردم و فعلا جواب میده، مشکل ساز میشه؟

سلام
نه، اگه تا الان مشکل نداشتی، دیگه مشکلی پیش نمیاد.
اگه از یه Thread بخوای به شی‌ای که تو یه Thread دیگه تولید شده دست بزنی خطا ایجاد می‌شه
که راه حلش Invoke کردن یه متد از اون Thread هست.

صبا صبوحی

MRasoul
پنج شنبه 30 بهمن 1393, 10:41 صبح
میشه یه نمونه از این Invoke بگی که چجوری استفاده میشه

SabaSabouhi
پنج شنبه 30 بهمن 1393, 11:18 صبح
سلام
خیلی ساده هست، مثلاً بجای این که به ListBox موجود توی فرم یه سطر اضافه کنی،
یه متد می‌نویسی که یک سطر به اون ListBox اضافه کنه.
حالا از اینجا به بعد یه کم تو WinForm و WPF تفاوت داره. شما که WinForm کار می‌کنی،
باید تو اون متد، خط اول چک کنی که آیا Invoke لازم هست یا نه، فکر کنم this.InvokeRequired بود.
اگه مثبت بود، معنیش اینه که این متد از یه Thread دیگه داره فراخوانی می‌شه. در این حالت
باید از متد ( this.Invoke( MyMethod استفاده کنی. MyMethod در واقع همین متد هست.
اگه این متد پارامتر لازم داره ( که معمولاً داره ) باید یه delegate بسازی مثل همین متد و
از cast استفاده کنی.
متاسفانه الان تکه کد براش ندارم، چون مدت زیادی هست که از WinForm به WPF مهاجرت! کردم.
اما اگه جست‌وجو کنی، حتماً نمونه هم پیدا میشه اینجا. ( حتا گمان کنم خودم هم یه نمونه اینجا
گذاشته بودم )

صبا صبوحی

MRasoul
پنج شنبه 30 بهمن 1393, 23:34 عصر
خیلی ممنون
منم دقیقا برای WPF میخوام
چون اول سوالم زیاد برای winform و wpf فکر کردم فرق نداره اینجا پرسیدم
ار میشه برای wpf مثال بزنین
خیلی ممنون

SabaSabouhi
شنبه 02 اسفند 1393, 09:42 صبح
خیلی ممنون
منم دقیقا برای WPF میخوام
چون اول سوالم زیاد برای winform و wpf فکر کردم فرق نداره اینجا پرسیدم
ار میشه برای wpf مثال بزنین
خیلی ممنون

سلام
رسول جان، کاش تو تالار WPF می‌پرسیدی که هم جاش مناسب‌تر بود و هم اونجا یه کم
از بی‌تحرکی بیاد بیرون :)

تو WPF این شکل‌ها دیده می‌شه:

Dispatcher.Invoke( (MyDelegate)MyMethod );
Dispatcher.Invoke( (MyDelegate2)MyMethod2, Parameter1 );
Dispatcher.Invoke( DispatcherPriority.Normal, (MyDelegate3)( () => {
// My Amonymous Method3 Code ;)
} ) );




صبا صبوحی

MRasoul
شنبه 02 اسفند 1393, 11:27 صبح
سلام
رسول جان، کاش تو تالار WPF می‌پرسیدی که هم جاش مناسب‌تر بود و هم اونجا یه کم
از بی‌تحرکی بیاد بیرون :)

تو WPF این شکل‌ها دیده می‌شه:

Dispatcher.Invoke( (MyDelegate)MyMethod );
Dispatcher.Invoke( (MyDelegate2)MyMethod2, Parameter1 );
Dispatcher.Invoke( DispatcherPriority.Normal, (MyDelegate3)( () => {
// My Amonymous Method3 Code ;)
} ) );




صبا صبوحی

سلام
باز ممنون
اینا رو امتحان کرده بودم جواب نگرفته بودم، شاید اشتباهی توی کدهام بوده،حالا باز با روش شما امتحان میکنم
توی تالار WPF هم مطرح کردم اینم لینکش
http://barnamenevis.org/showthread.php?486687-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DB%8C%DA%A9-dll-%D8%AF%D8%B1-%D8%AF%D9%88-thread