بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

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

مدیریت گفتگو
FSR 10 سال پیش
آخرین تغییر: 10 سال پیش

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

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

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

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

نظرات

FSR 10 سال پیش
بیشتر جواب های این لینک رو استفاده کردم جواب نداده !

پاسخ‌ها 3

Criss 10 سال پیش

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

boolean canwork = true;

private void mymethod(final int counter){

new Thread (Run . . .){

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

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

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

نظرات

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

 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 10 سال پیش

سلام

    از کلاس 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 ; // ذخیره آخرین زمان ثبت شده
}

}

نظرات


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