我创建了一个小型通用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++;
}
}
我很感激如何做到这一点。
答案 0 :(得分:1)
您应该更改Fiddler中的JavaScript设置:将“加载类型”设置为无包装,您的代码将起作用。
虽然我建议使用clearTimeout而不是标志。
答案 1 :(得分:1)
问题不是你的代码,而是jsfiddle中加载javascript的默认方式是如何工作的(nl,onload,所以是一个匿名函数)
因此,当您单击按钮时,您的功能暂停/恢复将不再可用。
要更改此设置,您可以更改页面中加载javascript的方式,最简单的方法是:
此时您的代码将部分工作(警报非常烦人,因为它会在每个时间间隔弹出),并且您的重置无法正常工作,因为var sim
是在本地定义的(如@razzak中提到的那样)另一个答案)
答案 2 :(得分:1)
我认为这不仅仅是一个小问题,请看这个:
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);
}
答案 3 :(得分:0)
如果用户单击暂停,则设置标志并在startSim
回调中处理它。如果您flag == 0
尝试模拟暂停,但您的索引计数器在11秒时变为22。在点击暂停之前,它会非常快速地显示出来。
答案 4 :(得分:0)
这是我的去处: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问题。我在JS部分用addEventListener
修复此问题,而不是在HTML按钮本身上使用onclick
。
<input type = "button" value = "togglepause" id = "pausebutton"/><br/>
document.querySelector('#pausebutton').addEventListener('click', togglepause);