2015-12-15 49 views
-1

我已经创建了一个小的通用4阶段管道,它模拟了提供的时钟周期。然而,我想暂停它,并在中间恢复它,我无法做到这一点。这是我的FIDDLE,暂停我想添加一个标志。在JavaScript中暂停计时器

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

你的代码添加到这个问题,而不是仅仅为纽带,另外,如果你只是想暂停,然后检查你的国旗0的区别在你做任何计算之前,如果没有,不要做任何事情,直到国旗再次变更 – Icepickle

+0

@Ippickle对不起,我已经添加了我的代码。我不确定你的意思我正在做你在说什么 – user1010101

+0

你这里的问题实际上是你的代码是如何加载的。如果您检查控制台输出,您将看到单击暂停时会抛出一个错误,指出它找不到方法“暂停”,所以您的标志不会设置为0.将它添加到标题中而不是使用onload函数jsfiddle的。你可以通过点击javascript设置轮,然后选择包装在身体或包装在头(默认是onload) – Icepickle

回答

1

的问题是没有这么多你的代码,而是如何加载中的jsfiddle的JavaScript的默认方式工作(NL,onload事件,所以匿名函数)

为此您的功能暂停/恢复不再可用当你点击你的按钮。

要改变这一点,您可以更改JavaScript是你的页面里面装载的方式,为您最简单的就是:

enter image description here

这时你的代码将部分工作(警报是很烦人它在每一个区间弹出),而且由于var sim是本地定义你的重置将无法正常工作(如

+0

是的工作,这只是一个jsfiddle问题?如果我将这段代码添加到我的电脑上,实际上js应该可以正常工作? – user1010101

+0

@ user1010101几乎是啊,它只是你需要知道 – Icepickle

+0

@ user1010101顺便说一句,其他的答案都是很好的建议,以改善你的代码,但只有拉扎克居然找到了原因是什么;) – Icepickle

0

如果用户单击暂停,您可以设置标志并在startSim回调中处理它。如果flag == 0您尝试模拟暂停,但您的索引计数器在11秒后变为22。在点击暂停之前,它会很快清楚。

0

这是我去:http://jsfiddle.net/j82j14r6/2/

相反的setInterval,我使用setTimeout和具有功能调用本身:

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

    setTimeout(tick, 500); 
} 

这允许对tickrate易于控制,暂停,结束等。

请注意,使用setTimeoutsetInterval并不是计算时间和/或制作循环的最准确的方法,但如果您的proj等不是太重要 - 这是一个好方法来做到这一点。

至于为什么你的按钮没有调用相应的功能......这主要是一个jsfiddle问题。我在JS部分用addEventListener修正了这个问题,而不是在HTML按钮本身上有onclick

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

document.querySelector('#pausebutton').addEventListener('click', togglepause); 
1

你应该改变在提琴手的JavaScript设置:设置“负载型”,以无包装和你的代码将工作。

虽然我会建议使用clearTimeout而不是标志。

1

我认为那不只是一个小提琴问题另一个答复中提到@razzak),看看这个:

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