آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل در thread

ATRAS  12 سال پیش  12 سال پیش
0 0

سلام.دوستای عزیز من در یک اکتیویتیم که تمام اکتیویتیام به اون extends شدن یک thread دارم که قرار یک متغیرو در فواصل زمانی 60000 میلی ثانیه اجرا کنه در ضمن چند thred  دیگر در اکتیویتیای دیگر، همزمان در حال اجرا هستن.مشکل اینجا است که بعد از یک دقیقه که  thread  باید یک بار اجرا بشه و به متغیر یکی اظافه کند در بعضی مواقع 3 تا و در بعضی مواقع 4 تا و همین جور متغیر به مقداری که میخوام اظافه میکنه.اگه دوستان میدونن دلیل این کار و رفع این مشکلو به من بگن.خیلی خیلی مهمه.

0 0
دقت کنید که اون متغیری رو که میخواید هر یک دقیقه یکی بهش اضافه بشه فقط توسط یک thread این عمل روش انجام بشه، چون اگر چند thread بخوان روی یک متغیر عملی انجام بدن ممکنه چنین مشکلاتی پیش بیاد و کنترل چنین وضعیتی یکم مشکل هست. (12 سال پیش)
+1 0
دقیقا یک thread این عملو انجام میده اون یکی thread ها کارای دیگرو امجام میدن.ولی انگار thread بعد از sleap چند دفعه کدای درونشو اجرا میکنه. (12 سال پیش)
0 0
کدو بزار (12 سال پیش)
0 0
فکر کنم شما وقتی اکتیویتی ها رو اجرا میکنید ،اون thread موجود توی اکتیویتی اصلی داره اجرا میشه و به متغیر اضافه میشه در واقع با هر بار اجرای هر اکتیویتی یک thread اجرا میشه تا به متغیر اضافه بشه ... (12 سال پیش)
+3 0
درحالت عادی وقتی در یک اکتیویتی هستم بعد یک دقیقه متغیر اظافه میشه ولی بیشتر وقتا 4 تا به متغیرم اظافه میکنه. (12 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
ATRAS  12 سال پیش
0 0


import android.os.Handler;


public class Mind extends V {

public static Handler handler1 = new Handler();


@Override
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mydate = "" + year + "/" + mon + "/" + day + "" + hor + ":ساعت";

Thread hour = new Thread(new Runnable() {

@Override
public void run() {
do {

try {
Thread.sleep(60 * 1000);
handlerpostmind();
}
catch (InterruptedException e) {

e.printStackTrace();
}

}
while (true);
}

});

hour.start();

};


public void handlerpostmind() {
Mind.handler1.post(new Runnable() {

@Override
public void run() {

getdaramad();

}
});
}


public void getdaramad() {

if (hor <= 24) {
hor += 1;
}
if (hor >= 24) {
day = day + 1;
hor = 1;
}
if (day >= 30) {

mon = mon + 1;
day = 1;
}
if (mon >= 12) {
year = year + 1;
mon = 1;
}

mydate = "" + year + "/" + mon + "/" + day + "" + hor + "ساعت";

}

}
0 0
دوستان اینم کدش. (12 سال پیش)
0 0
کسی نیست به داد من برسه؟؟؟؟ (12 سال پیش)
0 0
مدیران عزیز راه حل نمیدین؟ (12 سال پیش)
0 0
تورو خدا یکی به داد من برسه بدجور کارم گیره :-( (12 سال پیش)
پاسخ به سوال 
مجتبی یگانه  12 سال پیش
0 0

مهدی جوون فکر کنم مشکلت اینه 

فرض کن یک Activity داری که بقیه رو از اون extends کردی ، در همین اکتیویتی والد ، یک ترد ساختی و اون رو Start کردی !  ، خوب با این تفاسیر هر بار که شما بگی این Thread یک نمونه از اون Thread پدره یک بار اون ترد شروع به اجرا میکنه !  پس اگه یک لاگ داخل اون Thread بزاری و Thread ID رو چاپ کنی ، میبینی که 4 تا Thread در حال انجام کار هست :(

برای حل مشکلت ، Thead رو public static تعریف کن و هرجایی نیاز به اجرایThread داری Parent.myThread.start()z کن !

فکر کنم متوجه شده باشی داستان چیه !

0 0
داداش همین کارم کردم.ولی یکم از اجرای برنامه که میگذره پروسس ها که زیاد میشه بازم قاطی میکنه و بازم کاره خودشو انجام میده. راه بهتری سراغ نداری اصلا از thread استفاده نکم ولی کارش مثل thread باشه؟فقط میخوام زمانو برام نمایش بده. (12 سال پیش)
0 0
فکر کنم پاسخ پائین یکم کمکت کنه :) (12 سال پیش)
پاسخ به سوال 
مجتبی یگانه  12 سال پیش
0 0

فرض رو بر این بگیریم ، قصد داریم در برنامه  60 متغییر رو به عنوان تایمر در نظر بگیریم ! که هر کدوم در تایم خاصی شروع متوقف یا از سر گفته میشه ! ، خوب به نظرت باید 60 تا ترد بنویسیم ؟! شاید خیلی ها بگن آره ولی من میگم نه ! ، فقط یه ترد میخوایم

1- یک ساختار برای هر زمان ایجاد میکنیم

public class Struct {
public int id;
public int CurrentValue;
public Boolean RunThread;
}

خوب پس فقط کافیه یه Adapter براش بنویسیم که بصورت زمانبندی شده این ها رو بروز کنه و این کار رو یک ترد برای ما انجام میده

final ArrayList<Struct> items = new ArrayList<Struct>();
items.add(...);
items.add(...);
items.add(...);
Thread adapterThread = new Thread(new Runnable() {
	@Override
	public void run() {
	
		while (true) {
			for (Struct item: items) {
			
					if (item.RunThread) {
						item.CurrentValue++;
					}
					
			}
			
			try {
				Thread.sleep(1000);
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
});
adapterThread.start();

پس چیز بدرد بخوری میشه D:

0 0
دمت گرم (12 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .