PDA

View Full Version : شکل متحرک



حميدسي شارپ
سه شنبه 20 آبان 1393, 08:58 صبح
سلام دوستان و خسته نباشید.
من چند وقت پیش با جاوا مجبور شدم یه پروژه بنویسم به این شکل که داخلش دوتا دایره حرکت کنن و به هم که خوردن باز منعکس بشن.شبیه اسکرین سیور ویندوز 7.
البته در حد ساده.
برای این کار اومدم و از Thread ها استفاده کردم.
اونجا این مشکلو داشتم که وقتی می خواستم مثلا دایره ی رو از مکان x1 و y1 ببرم به x2 و y2 میومدم و از

try {
Thread.sleep(5);
g2.setColor(Color.green);
g2.fillOval(ax1, ay1, 60, 60);
} catch (Exception e) {
}
استفاده می کردم. در واقع کد بالا رو داخل یه حلقه ی for می گذاشتم و هر دفعه مختصات رو از x1 و y1 به x2 وy2 نزدیک و نزدیکتر میکردم.
مشکلش اینجا بود که وقتی برنامه اجرا میشد، تا زمانی که از نقطه 1ی 1 به نقطه ی 2 نمیرسید، نمیتونستم فرم رو ببندم و کاریش کنم.قفل میشد.
واسه همین اومدم و از کلاسی تحت عنوان runnable استفاده کرد.
به این شکل که کدهای حرکت کردن دایره رو ریختم داخل یه تابع مثلا به اسم mov1 . بعد یه ترد بصورت سراسری تعریف کردم.

static Thread first;
بعد یه کلاس ساختم به شکل زیر:

public class movecircle1 implements Runnable {

@Override
public void run() {

mov1();

}
}
در واقع این کلاس میاد و از کلاس Runnable یه چیزایی رو ارث بری میکنه.و تابع رو داخل متد run از این کلاس اجرا کردم تا بتونم توانایی stop کردن داشته باشم و از هنگ کردن سیستم موقع حرکت دایره ها، جلوگیرری کردم.
برای استفادش هم کلاس رو به این شکل new کردم:

movecircle1 mo = new movecircle1();

first = new Thread(mo);
و ترد رو راه اندازی کردم

first.start();
حالا من می خوام تو سی شارپ یه شکل هندسی رو حرکت بدم.با اینش مشکل ندارم.دقیقا مثل مثال بالا این کار رو داخل تابع mov1 انجام می دم.بازم مشکلم اینه که نمیتونم از thread استفاده کنم.یعنی موقع استفاده، زمانی که دایره داره از نقطه ی 1 به 2 میرسه، نمیشه هیچ کاری کرد و عملا فرم قفله.
واقعا ببخشید که زیاد شد دوستان.فقط خواستم بگم الکی نیومدم که زود جواب بگیرم و یا سرچ نکرده باشم.ممنون میشم راهنماییم کنین.آخه نمیتونم تو سی شارپ یه کلاس بسازم که از کلاسی مثل Runnable ارث بری کنه.
دوستان میتونن کمک کنن و بگن چجوری این کارو کنم؟در ضمن من حتما باید از Thread ها استفاده کنم، وگرنه با استفاده از timer به راحتی میشه این کارو انجام داد...

hamid_hr
سه شنبه 20 آبان 1393, 12:53 عصر
راه حل زیاد داره
یکیش اینه



public void UpdateProgress(int percentComplete)
{
if (!InvokeRequired)
{
ProgressBar.Value = percentComplete;
}
else
{
Invoke(new Action<int>(UpdateProgress), percentComplete);
}
}


این یه پروگرس بار رو اپدیت میکنه
شما کدای خودتو تو ترد مینویسی و زمانی که خواستی یه خاصیت از کنترلهای داخل فرمتو عوض کنی این تابعو صدا میزنی تا برات این کار رو بکنه