PDA

View Full Version : سوال: ریسمان ها



meysam_meysam74
سه شنبه 14 خرداد 1387, 10:51 صبح
سلام به همه
خوب به کمک ریسمان ما میتونیم چنتا کارو با هم انجام بدیم حالا مشکل اینجاست که اگه ما یه ریسمان مستقل درست کنیم دیگه اون ریسمان از برنامه ما جداست و به برنامه دسترسی نداره مثلا اگه من بنویسم که listbox1.add Err میگیره یا اصلا هر ocx دیگه ای ممکنه توضیع بدین که چه جوری میشه از داخل ریسمان به اتم های برنامه دسترسی داشت !

رضا عربلو
سه شنبه 14 خرداد 1387, 11:04 صبح
شما می توانید Thread تان را به یک متد پارامتردار گره بزنید.به این صورت که :(یک همچین چیزی)


class class1
{
void Method1(object Parameter)
{
}
}
.
.
.
Class1 c = new Class1();
ParameterizedThreadStart pts= new ParameterizedThreadStart(c1.Method1);
Thread t = new Thread(pts);
t.Start(new Object());

که شما می توانید به جای new Object() پرارمتر خود را به Thread پاس بدهید.

meysam_meysam74
سه شنبه 14 خرداد 1387, 19:12 عصر
ممنون از تایپ ولی این الگریتم فکر نکنم برایه vb.net 8 باشه بیشتر به vc++ میخوره
من نتونستم ازش استفاده کنم اگه امکان داره وضه تر توضع بدین

رضا عربلو
سه شنبه 14 خرداد 1387, 20:23 عصر
مثال بالا به زبان C# است.
http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

vcldeveloper
چهارشنبه 15 خرداد 1387, 02:31 صبح
خوب به کمک ریسمان ما میتونیم چنتا کارو با هم انجام بدیم حالا مشکل اینجاست که اگه ما یه ریسمان مستقل درست کنیم دیگه اون ریسمان از برنامه ما جداست و به برنامه دسترسی نداره
Threadهایی که شما در یک برنامه درست می کنید، وابسته به Thread اصلی برنامه هستند. اینطور نیست که اون Thread از برنامه شما جدا باشه.


توضیع بدین که چه جوری میشه از داخل ریسمان به اتم های برنامه دسترسی داشت !
دقت داشته باشید که کنترل های ویندوز که در رابط گرافیکی کاربر بکار میرند، Thread-Safe نیستند و شما نباید از طریق یک Thread دیگه کنترل های رابط کاربر را تغییر بدید! غیر از اینکه در مستندات های مربوط به دات نت اعلام شده باشه که کلاس های دات نتی که کنترل های رابط کاربر ویندوز را Wrap می کنند، در داخل خود مکانیزمی را برای استفاده از این کنترل ها بصورت Thread-safe فراهم کردند.
احتمالا همچین مکانیزمی در دات نظر گرفته نشده. در هر حال، قبل از انجام کاری که مطرح کردید، حتما مسئله ایی که اشاره کردم را بررسی کنید تا بعدا به مشکلات عجیب و غریب گرفتار نشید.

meysam_meysam74
چهارشنبه 15 خرداد 1387, 09:42 صبح
توضیع بدین که چه جوری میشه از داخل ریسمان به اتم های برنامه دسترسی داشت !

توضیع بدین که چه جوری میشه از داخل ریسمان به ایتم های برنامه دسترسی داشت !
مراحل استفاده از ریسمان تویه ویبی دات نت اینجوری هست


Imports System.Threading
Dim Therd1 As Thread
Therd1 = New Thread(AddressOf FunctionNAme)

خوب حالا من میخوام به جایه این


Therd1.Start()

از این استفاده کنم


Therd1.Start(Parameter)

امکان داره یه نمونه بارم بزارین یا یه توضیع کچیک بدین که من چه جوری باید به تبع خودم ورودی بدم !

رضا عربلو
چهارشنبه 15 خرداد 1387, 11:10 صبح
مسئله Thread-Safe نبودن بسیاری از دستورات دات نت، هنگامی برای ما مشکل زا می شود که چند thread به خواهند بطور همزمان آن تکه از کد ما را اجرا کنند. و در این حالت بایستی همواره این مورد را در نظر بگیریم که حتی ممکن است در وسط اجرای یک دستور تخصیص ممکن است کنترل از thread ما خارج و به thread دیگری برود. که راه حلهای برای آن نیز وجود دارد از جمله lock کردن قطعه کدمان که می خواهیم تا انتها توسط thread مان اجرا شود.
بدیهی است که این مشکل هنگامیکه یک thread اکتیو داشته باشیم اصلاً وجود نخواهد داشت.
همچنین من تا این جا نخوانده ام که "نباید از طریق یک Thread دیگه کنترل های رابط کاربر را تغییر بدید"

amirsajjadi
چهارشنبه 15 خرداد 1387, 12:59 عصر
با سلام
قبل از استارت کردن thread باید از این قطعه کد استفاده کنی


Control.CheckForIllegalCrossThreadCalls = False

vcldeveloper
چهارشنبه 15 خرداد 1387, 16:58 عصر
بدیهی است که این مشکل هنگامیکه یک thread اکتیو داشته باشیم اصلاً وجود نخواهد داشت.
وقتی یک Thread جدید به برنامه اضافه می کنید، دیگه یک Thread فعال ندارید، بلکه دو تا Thread فعال دارید:
1- Thread اصلی برنامه
2- Thread ایی که جدیدا ساختید.


همچنین من تا این جا نخوانده ام که "نباید از طریق یک Thread دیگه کنترل های رابط کاربر را تغییر بدید"
خیلی چیزها هست که من و شما هنوز نخوندیم:
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

meysam_meysam74
پنج شنبه 16 خرداد 1387, 10:24 صبح
ممنون اقا امیر مشکل من تویه سرس با این کد حل شد


Control.CheckForIllegalCrossThreadCalls = False

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

vcldeveloper
پنج شنبه 16 خرداد 1387, 17:53 عصر
مشکل من تویه سرس با این کد حل شد
کد بالا مشکل شما را حل نکرد، بلکه صورت مسئله رو پاک کرد! CheckForIllegalCrossThreadCalls بطور پیش فرض True هست تا اجازه نده شما وضعیت یک کنترل را از داخل Thread ایی غیر از Thread ایی که اون کنترل را ساخته، تغییر بدید. چون ممکن هست در شرایط خاصی، بعضی از برنامه نویس ها نیاز داشته باشند که این عملکرد را غیرفعال کنند، امکان False کردن آن هم فراهم شده. مسئله شما شامل اون شرایط خاص نمیشه، بلکه با False کردن این خصوصیت عملا به دات نت میگید، من میدانم تغییر وضعیت یک کنترل از طریق یک Thread دیگه چه تبعاتی به همراه داره، پس تو گیر نده! در حالی که سوال شما و جواب دوستان شما نشون میده که اطلاعی از این موضوع ندارید و همین موضوع میتونه بعدها که پروژه پیشرفت بیشتری کرد، موجب دردسرهای زیادی براتون بشه. الان متوجه گیرهای Multi-threading نمیشید، وقتی توی برنامه تون مشکلی پیش میاد و با هر ابزار دیباگی که کد را بررسی می کنید، نمی تونید علت مشکل را متوجه بشید، یادتون میاد که Multi-threading قلق های خودش رو داره و اگر بخواد گیر بده، روزگار آدم سیاه میشه!
برای اطلاع بیشتر از CheckForIllegalCrossThreadCalls:
http://blogs.msdn.com/jfoscoding/archive/2005/05/12/416910.aspx

meysam_meysam74
دوشنبه 20 خرداد 1387, 12:44 عصر
نمیدونم بعد از یه مدت وقتی یه ocx جدید به پروژم اظافه کردم (ocx قدیمی بود)دیگه اصلان با ocx های خود vb.net هم نمیشد کار کرد خطا : میگفت که این ocx تک ریسمانی هست یه چیزی تویه انی مایع ها
بی خیال ریمان فعلا شدم کدا رو تویه یه تایمر جا به جا کردم