ورود

View Full Version : سوال: وقفه ی چند ثانیه ای میان تابع بازگشتی و از سرگیری دوباره آن



golsa_6
دوشنبه 26 فروردین 1392, 02:40 صبح
سلام

چطور می شود کاری کرد که یک تابع بازگشتی مدام در حین اجرای خودش چند ثانیه وقفه داشته باشد و دوباره ادامه ی کارش را از سر بگیرد؟؟

هر چه با ترد ها امتحان کردم نشد!

تابع بازگشتی من چون از کلاس graphics برای کشیدن چیزی استفاده میکند، ترد ها باعث میشوند که بجای اینکه آنچه میخواهم بکشم، ذره ذره کشیده شود؛ مدتی توقف داشته باشد و سپس یکباره باهم کشیده شود! من نمیخواهم اینطور باشد! بلکه من میخواهم آنچه قرار است تابع بازگشتی نمایش دهد، به تدریج نمایش داده شود.

باید چه کنم؟ :متفکر:

chris66001
دوشنبه 26 فروردین 1392, 10:48 صبح
سلام

چطور می شود کاری کرد که یک تابع بازگشتی مدام در حین اجرای خودش چند ثانیه وقفه داشته باشد و دوباره ادامه ی کارش را از سر بگیرد؟؟

هر چه با ترد ها امتحان کردم نشد!

تابع بازگشتی من چون از کلاس graphics برای کشیدن چیزی استفاده میکند، ترد ها باعث میشوند که بجای اینکه آنچه میخواهم بکشم، ذره ذره کشیده شود؛ مدتی توقف داشته باشد و سپس یکباره باهم کشیده شود! من نمیخواهم اینطور باشد! بلکه من میخواهم آنچه قرار است تابع بازگشتی نمایش دهد، به تدریج نمایش داده شود.

باید چه کنم؟ :متفکر:


اگه میخواهی وقفه داشته باشه که میتونی تو ترد از متد sleep استفاده کنی ولی اگه میخوای روتین و بدون وقفه انجام بشه بحث ــش جداست

golsa_6
دوشنبه 26 فروردین 1392, 15:15 عصر
فکر کنم منظورم را متوجه نشدید !!!!

من در یک کلاس، متد PaintComponent(Graphics g) را دارم که درون این متد، یک تابع بازگشتی صدا شده است.
این تابع بازگشتی با روش تقسیم و غلبه نوشته شده است، و من چهار زیرمساله در آن دارم. قصد من این است که میخواهم هر زیرمساله ی کوچک که حل شد، نتیجه اش همان موقع نشان داده شود؛ نه زمانی که کل زیرمسائل حل شدند!
از sleep استفاده کردم اما به جای اینکه درون تابع بازگشتی من وقفه بیندازد، با اجرا شدن برنامه، مدتی صبر میکرد و بعد نتیجه ی تابع بازگشتی را یکدفعه باهم نشان میداد.
همان طور که گفتم من میخواهم نتیجه به تدریج نشان داده شود و sleep این خواسته ی من را برآورده نکرد!

agusta.ada
دوشنبه 26 فروردین 1392, 15:51 عصر
اگه کد رو قرار بدید بهتر میشه کمک کرد.

golsa_6
دوشنبه 26 فروردین 1392, 15:57 عصر
میخوام فرآیند کشیدن رو بطور تدریجی نشون بده:

public void paintComponent(Graphics g){
super.paintComponents(g);
x1=32; x2=672; y1=5; y2=672;
g.drawRect(32, 5, 640, 640);
while(x1!=x2 && y1!=y2){
x1+=m;
y1+=m;
g.drawLine(x1, 5, x1, 645);
g.drawLine(32, y1, 672, y1);
}

Tiling(g,32,5,k,m-1,4);

}

private void Tiling(Graphics g,int x, int y, int k,int m, int s) {

if(k==1 && s==1 && t){
g.setColor(Color.red);
g.fillRect(x+1, y+m+2, m, m);
g.fillRect(x+m+2, y+1, m, m);
g.fillRect(x+m+2, y+m+2, m, m);
}
else if(k==1 && s==2 && t){
g.setColor(Color.blue);
g.fillRect(x+1, y+1, m, m);
g.fillRect(x+1, y+m+2, m, m);
g.fillRect(x+m+2, y+m+2, m, m);
}
else if(k==1 && s==3 && t){
g.setColor(Color.green);
g.fillRect(x+1, y+1, m, m);
g.fillRect(x+m+2, y+1, m, m);
g.fillRect(x+m+2, y+m+2, m, m);
}
else if(k==1 && s==4 && t){
g.setColor(Color.magenta);
g.fillRect(x+1, y+1, m, m);
g.fillRect(x+1, y+m+2, m, m);
g.fillRect(x+m+2, y+1, m, m);
}

else if(k!=1){
if(s==1){
Tiling(g,x,y,k-1,m,1);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y,k-1,m,3);
Tiling(g,x,y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,2);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,1);
//merge
Tiling(g,x+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),y+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),k-1,m,1);
}
else if(s==2){
Tiling(g,x,y,k-1,m,4);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y,k-1,m,2);
Tiling(g,x,y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,2);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,1);
//merge
Tiling(g,x+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),y+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),k-1,m,2);
}
else if(s==3){
Tiling(g,x,y,k-1,m,4);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y,k-1,m,3);
Tiling(g,x,y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,3);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,1);
//merge
Tiling(g,x+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),y+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),k-1,m,3);
}
else if(s==4){
Tiling(g,x,y,k-1,m,4);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y,k-1,m,3);
Tiling(g,x,y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,2);
Tiling(g,x+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),y+((int)(Math.pow(2,k-1))*m)+(int)(Math.pow(2,k-1)),k-1,m,4);
//merge
Tiling(g,x+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),y+((int)(Math.pow(2,k-2))*m)+(int)(Math.pow(2,k-2)),k-1,m,4);
}
}
}

agusta.ada
دوشنبه 26 فروردین 1392, 18:46 عصر
دوست عزیز اگه کلاس رو کامل قرار میدادید بهتر بود در هر صورت مشکل از ترد نیست و مشکل از الگوریتم شما است که اصلا شرط متد paintComponent پایان ناپذیره و طبیعتا کنترل اجرای برنامه به خطوط بعدی رجوع نمی کند که اگر میکرد کار با افسل الاسافلین بود(kidding).
کد زیر رسم خط را با وقفه ای قابل مشاهده انجام میدهد.(البته نه چندان با کارایی بالا)
[JAVA][/Jpublic void paintComponent(Graphics g, Thread t) {
int x =0, y = 0;

for(int i=0; i<100; i++) {
g.drawLine(x, y, x+i, y+i);
try { t.sleep(100); } catch (InterruptedException ie) {}
}
}AVA]