2015-12-15 77 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