PDA

View Full Version : thread



ofog_22
پنج شنبه 14 مرداد 1389, 12:55 عصر
سلام و خسته نباشید عرض می کنم خدمتتون
من می خوام با استفاده از تردها 2 باتن رو به حرکت در بیارم
ولی با مشکل مواجه شدم برنامه ام رو می گذارم منو راهنمایی ام کنین
نمی تونم اررورش رو حل کنم
در ضمن از sleep می خوام برای تغییر button ها استفاده کنم
فقط لطفا خیلی سریغ بهم جواب بدین
من منتظرتونم
لطفا سریع فقط

#eafshary#
پنج شنبه 14 مرداد 1389, 15:27 عصر
سلام برو حالشو ببر:قهقهه:

ofog_22
پنج شنبه 14 مرداد 1389, 17:12 عصر
خیلی ممنونم از لطفتون
ولی من از تردها استفاده می کنم که هر دو button همزمان با هم شروع به حرکت کنه
تو این برنامه که شما گذاشتین اول یکی حرکت می کنه وقتی تموم شد اون یکی شروع به حرکت میکنه
من می خوام هر دوتاش با هم شروع به حرکت کنن
تو رو خدا کمکم کنین بدجوری گیر کردم
منتظرم

محسن شامحمدی
پنج شنبه 14 مرداد 1389, 17:40 عصر
خب توی تابعی که ترد اجراش می کنه اون یکی دکمه دیگه رو هم حرکت بده اشکالی ایجاد نمی شه

ofog_22
پنج شنبه 14 مرداد 1389, 18:31 عصر
ببینید من با سرعت های متفاوت می خوام حرکتشون بدم
اون جوری سرعت یکی میشه
لطفا کمکم کنید
لطفا
لطفا

#eafshary#
پنج شنبه 14 مرداد 1389, 18:31 عصر
یبشتر برو حالشو ببر:قهقهه::قهقهه::قهقهه:

vcldeveloper
شنبه 16 مرداد 1389, 13:09 عصر
من می خوام با استفاده از تردها 2 باتن رو به حرکت در بیارم

یبشتر برو حالشو ببر

از شما به خاطر راهنمایی که کردین واقعا ممنونتونم
من با #C کار نمی کنم، اما با یک نگاه به کد نوشته شده میشه فهمید که این کد مشکل داره! قبل از اینکه بخواد از Thread استفاده کنید، باید با مفاهیم آن آشنا باشید. کاری که کد شما میکنه این هست:

1- دو Button در داخل فرم توسط Thread اصلی برنامه ساخته میشند.
2- دو Thread جدید در برنامه اجرا میشند، که قرار هست دو Button مرحله اول رو حرکت بدند.
3- دو Thread مرحله قبل، نمی تونند Buttonها را مستقیما حرکت بدند، چون Buttonها در داخل Thread دیگه ایی ایجاد شدند. برای اینکه این مشکل رو دور بزنید، رفتید از متد Invoke استفاده کردید. متد Invoke هم برای اینکه درخواست شما انجام بشه، درخواست شما رو محول میکنه به Thread اصلی که Thread ایجاد کننده اون Button ها ست.
4- Thread اصلی هم درخواست شما که از طریق Invoke بهش رسیده رو انجام میده.

پس چی شد؟ همه کارها رو همون Thread اصلی انجام داد، و دو Thread ساخته شده توسط شما عملا کار مفیدی انجام ندادند! برای اینکه تاثیر همچین کدی رو ببینید، برنامه رو اجرا کنید، و می بینید که هر چند شما دو Thread نوشتید که کار حرکت اشیاء را براتون انجام بدند، ولی برنامه تان تقریبا حالت Freeze پیدا میکنه، چون اون دو Thread دارند در یک حلقه مرتبا برای Thread اصلی درخواست ارسال می کنند، و بخش عمده ایی از وقت Thread اصلی صرف پاسخ دهی به این درخواست ها و رسم مجدد اشیاء روی فرم میشه.

در واقع، اگر شما برای اون دکمه Start تون، به جای اون کدها، کد ساده ایی مثل این می نوشتید:


for (int i = 0; i < 150; i++)
{
btn1.Left = btn1.Left + 2;
btn2.Left = btn2.Left + 2;
Thread.Sleep(500);
Application.DoEvents();
}

انجام عملیات مربوطه (یعنی حرکت Buttonها) با سربار کمتر و کارایی بهتری از او کد به اصطلاح multi-threaded ایی که نوشتید، صورت می گرفت! چون در هر دو حالت کار اصلی رو داره Thread اصلی برنامه انجام میده، با این تفاوت که در کد دوم، شما نه سربار ایجاد دو Thread اضافه رو دارید، و نه Freeze شدن رابط کاربر رو.

استفاده از Thread ها در هر محیط توسعه ایی و با هر زبان برنامه نویسی، اگر بدون داشتن اطلاعات کافی از اصول اولیه آنها، و چگونگی کارکرد آنها باشه، بیشتر از اینکه بهتون کمک کنه، میتونه مشکلات متعددی براتون فراهم کنه!

#eafshary#
شنبه 16 مرداد 1389, 22:09 عصر
من با C#‎ کار نمی کنم، اما با یک نگاه به کد نوشته شده میشه فهمید که این کد مشکل داره! قبل از اینکه بخواد از Thread استفاده کنید، باید با مفاهیم آن آشنا باشید. کاری که کد شما میکنه این هست:

1- دو Button در داخل فرم توسط Thread اصلی برنامه ساخته میشند.
2- دو Thread جدید در برنامه اجرا میشند، که قرار هست دو Button مرحله اول رو حرکت بدند.
3- دو Thread مرحله قبل، نمی تونند Buttonها را مستقیما حرکت بدند، چون Buttonها در داخل Thread دیگه ایی ایجاد شدند. برای اینکه این مشکل رو دور بزنید، رفتید از متد Invoke استفاده کردید. متد Invoke هم برای اینکه درخواست شما انجام بشه، درخواست شما رو محول میکنه به Thread اصلی که Thread ایجاد کننده اون Button ها ست.
4- Thread اصلی هم درخواست شما که از طریق Invoke بهش رسیده رو انجام میده.
......

خداییش خیلی خوب توضیح دادید. بله من اشتباه کردم و همینجا هم از پست بدرد نخورم عذر خواهی می کنم با تشکر