Я создал небольшой общий 4-х этапный конвейер, и он имитирует предоставленный период времени. Однако я хотел приостановить его и возобновить в середине, и я не в состоянии это сделать. Это моя FIDDLE и для паузы, которую я подумал добавить флаг.

if flag == 1 //keep simulating
if flag == 0 // pause simulation where it is
if flag == 0 and click resume resume simulation until its end

var flag = 1; //initial value
function pause(){
 flag = 0;
}
function resume(){
 flag = 1;
}
//i try to check if flag is 0 then alert pause or something but no luck

function startSim(){
  document.getElementById('clockDiv').innerHTML = 'Clock Period '+clockPeriod;
  if(index == 22){
    clearInterval(sim);
  }else if(flag == 0){
      alert("Simulation Paused");
  }else{
  clockPeriod++;
    fetch();
    decode();
    execute();
    store();
  index++;
 }
}

Буду признателен за советы, как это сделать.

-1
user1010101 15 Дек 2015 в 19:00

5 ответов

Лучший ответ

Проблема не столько в вашем коде, сколько в том, как работает способ загрузки javascript по умолчанию в jsfiddle (nl, onload, так что анонимная функция)

Для этого ваши функции пауза / возобновление больше не доступны, когда вы нажимаете свои кнопки.

Чтобы изменить это, вы можете изменить способ загрузки javascript внутри вашей страницы, для вас самым простым является:

enter image description here

В настоящее время ваш код будет частично работать (оповещение очень раздражает, так как оно появляется через каждый интервал), и ваш сброс не будет работать, потому что var sim был определен локально (как @razzak упоминалось в другом ответе)

1
Icepickle 15 Дек 2015 в 16:21

Я думаю, что это не просто вопрос скрипки, посмотрите на это:

function start(){
var sim = setInterval(function(){startSim()},500);
}

....
if(index == 22){
  clearInterval(sim);
}else if(flag == 0){
  alert("Simulation Paused");
....

Вы создаете sim внутри локальной области функции, а затем используете его внутри другой функции ... это на самом деле ошибка.

Использовать это:

function start(){
    return setInterval(function(){startSim()},500);
}

FIDDLE

1
Vanojx1 15 Дек 2015 в 16:30

Если пользователь нажимает паузу, вы устанавливаете флаг и обрабатываете его в обратном вызове startSim. Если flag == 0 вы пытаетесь смоделировать паузу, но ваш счетчик индекса становится 22 через 11 секунд. Это будет ясно очень быстро, прежде чем вы нажмете паузу.

0
theodor 15 Дек 2015 в 16:12

Вот мой путь: http://jsfiddle.net/j82j14r6/2/

Вместо setInterval я использую setTimeout и сам вызываю функцию:

function tick()
{
   if(!paused)
   {
         // Do stuff
       document.querySelector('#log').value = ticks;
       ticks++;
   }

   setTimeout(tick, 500);
}

Это позволяет легко контролировать тикрат, паузу, окончание и т. Д.

Обратите внимание, что использование setTimeout или setInterval не совсем точный способ подсчета времени и / или создания таких циклов, но в случае, если ваш проект не слишком важен - это хороший способ сделать Это.

Что касается того, почему ваши кнопки не вызывают соответствующие функции ... это в основном проблема jsfiddle. Я исправил это с помощью addEventListener в разделе JS вместо того, чтобы onclick на самой кнопке HTML.

<input type = "button" value = "togglepause" id = "pausebutton"/><br/>

document.querySelector('#pausebutton').addEventListener('click', togglepause);
0
Piwwoli 15 Дек 2015 в 16:15

Вы должны изменить настройки JavaScript в Fiddler: установите «Load Type» в «no-wrap», и ваш код будет работать.

Хотя я бы предложил использовать clearTimeout вместо флагов.

1
Ciprian Benyi 15 Дек 2015 в 16:16