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

مشکل متوقف کردن Thread 

FSR  7 سال پیش  7 سال پیش
0 0

من میخوام یه تایمر بسازم که با زدن یه دکمه متوقف بشه و با زدن دوباره همون دکه ادامه بده!

ولی مشکل اینجاست که متد های Stop , Resume در Thread منسوخ شدن و راه حل درستی در دست نیست !

تویه سایت هم سرچ کردن بیشتر بچه ها میگفتن از یه متغییر بولین تویه شرط استفاده کنید که اینم راه حل جالبی نبود!

از دوستان میخوام که اگه راه حل درستی دارن  راهنماییم کنن!

+2 0
لینک (7 سال پیش)
0 0
بیشتر جواب های این لینک رو استفاده کردم جواب نداده ! (7 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
Criss  7 سال پیش
+2 0

ترد هیچوقت متوقف نمیشه مگر اینکه دستورات درونش تموم بشه ، مثلا اکر حلقه ایی دارید < اون حلقه باید بشکنه <

boolean canwork = true;

private void mymethod(final int counter){

new Thread (Run . . .){

while(canwork) {
counter++;
}
}
}

مقدار canWork رو از بیرون false کنید < حلقه از کار میوفته <

برای ادامه دادن Counter یک مقدار به متد بفرستید و قبل از صدا زدن متد مقدار canwork رو true کنید بعد از اون با false کردن مقدار canwork میتونید حلقه رو بشکنید و کار ترد تموم میشه

0 0
حرف شما درست ! فرض کنید من یه تایمر دارم که میخواد 50 ثانیه رو بشماره من رویه 30 ثانیه اون رو با این روش متوقف میکنم ! ولی مشکل اینجاست که برای ادامه اون تایمر وقتی که canwork رو true میکنم و میخوام thread رو start کنم برنامه کرش میکنه ! برای ادامه دادن تایمر باید چی کار کنم ؟ (7 سال پیش)
+1 0
خطاهاتون رو قرار بدید بهمراه سورس مربوطه تا بشه بهتر بررسی کرد . (7 سال پیش)
+1 0
@fsr ترد رو دوبار نمیشه استارت کرد (مگر این که قبلش null اش کرده باشین و دوباره new کرده باشین) . شما بار دوم که ترد رو استارت می کنین کرش می کنه. (7 سال پیش)
+1 0
@fsr ترد رو دوبار نمیشه استارت کرد (مگر این که قبلش null اش کرده باشین و دستورات runnable اش تمام شده باشن و دوباره new کرده باشین) . شما بار دوم که ترد رو استارت می کنین کرش می کنه. (7 سال پیش)
+2 0
لینک (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
ترد رو null هم کردم ولی جواب نداد ! یه راه حلی به ذهنم رسیده ولی منطقی نیست میخوام یه آرایه ای از Thread ها تعریف کنم که برای ادامه شمارش بعد از stop کردن متد از ترد هایی استفاده کنم که قبلا استفاده نشدن!ولی مشکل اینجاست که اگه کاربر بیش از اندازه تایمر رو Stop کنه و دوباره اجرا کنه این طوری باید 100 تا Thread تعریف کنم ! الان موندم چی کار کنم یعنی هیچ راهی برای این مشکل وجود نداره ؟ (7 سال پیش)
0 0
اقا ببخشید کامپیوترم قات زد ! (7 سال پیش)
پاسخ به سوال 
FSR  7 سال پیش
0 0

 thread = new Thread(new Runnable() {

            public void run() {

                while (time < percent && mustThread) {
//perecent تایم مورد نظر try { Thread.sleep(200); time++; Log.i("Time", time + ""); cusTimer.setPresent(time, numberMin, numberSec);
//کنترل سفارشی } catch (InterruptedException e) { e.printStackTrace(); } } } });
_______________________________________________________________________________________
//موقع شمارش زمان
imgPlay.setOnClickListener(new OnClickListener() { public void onClick(View v) { mustThread = true; thread1.start(); } });
_______________________________________________________________________________________
//موقع از سر گیری زمان بعد از توقف
imgBell.setOnClickListener(new OnClickListener() { public void onClick(View v) { mustThread = true; thread1.start(); // مشکل اینجاست
} });
_________________________________________________________________________________________
// توقف تایم
imgStop.setOnClickListener(new OnClickListener() { public void onClick(View v) { mustThread = false; } });
پاسخ به سوال 
Reza  7 سال پیش
+1 0

سلام

    از کلاس Timer استفاده کنید . یه متد داره به نام cancel که راحت میتونی تایمر رو متوقف کنی . و البته برای شروع مجدد تایمر باید یک timer جدید بسازید :

 long firstTime;
long currentTime;
long elapsedTime;// زمان سپری شده در هر فراخوانی تایمر
long lastElapsedTime = 0;// زمان سپری شده در کل فراخوانی ها و توقف ها
Timer timer;

//=================================================================================

private void startTimer(long lastElapsedTime) {

firstTime = System.currentTimeMillis();

timer = new Timer();
timer.schedule(new TimerTask() {

@Override
public void run() {

currentTime = System.currentTimeMillis();
elapsedTime = (currentTime - FirstTime) + lastElapsedTime;
// UI کارهایی که قراره هر 1 میلی ثانیه انجام بشه مثل نمایش زمان سپری شده به میلی ثانیه و آپدیت

}
}, 1, 1);
}

    هر موقع خواستی تایمر رو شروع کنی ، متد startTimer رو با پارامتر مجهول lastElapsedTime صدا بزن و کدهای خودتو بنویس و UI رو آپدیت کن . و هر موقع خواستی تایمر رو متوقف کنی متد StopTimer رو صدا بزن تا cancel بشه :

 private void stopTimer() {

if (timer != null) {
timer.cancel();
lastElapsedTime = elapsedTime ; // ذخیره آخرین زمان ثبت شده
}

}

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