2011-06-21 52 views
3

概述: 我們公司需要具有訪問本地資源(RS232 /串行設備)的Web應用程序。經過一些研究和POC之後,我們放棄了諸如ActiveX,Java Applet等選項,並決定創建本地應用程序(用C#編寫,稍後將轉換爲服務並分發給客戶),該應用程序讀取串行數據並通過HTTP協議提供服務簡單的TCP服務器回答必要的標題+簡單的串行數據)。然後,Web應用程序將AJAX讀入這些數據的「http:// localhost:8080」。在不犧牲CPU資源的情況下睡眠在JavaScript web worker中

所有這些都是在一個Web工作者在一個while循環發佈消息的主線程填充它的表單的輸入元素中完成的。通過提供靜態內容,我可以獲得不錯的表現。在Windows上的Chrome 13中,較舊的Intel Dual Core(非Core 2 Duo)1,6GHz CPU上每秒有300-350次迭代,Web Worker線程佔用5-9%的CPU。

問:我現在想要實現的是通過在每個ajax請求後插入某種sleep()函數來節制web worker中的輪詢間隔。開始時嘗試100ms。

什麼是最好的解決方案,而不會犧牲線程中的CPU資源?

注意:我可以在TCP服務器代碼中插入一些延遲作爲最後的手段。

編輯:

我需要睡在工人。示例(簡單化爲清楚起見):

AJAX = new XMLHttpRequest(); 
while (true) { 
    AJAX.open("GET", "http://127.0.0.1:8080", false); 
    AJAX.send(null); 
    var ean = AJAX.responseText; 
    if (ean != '') { postMessage(ean); } 
    /* NEED TO SLEEP HERE WHETHER THE RESPONSE WAS SENT OR NOT */ 
} 
+0

您是否考慮過使用WebSockets進行真正的TCP連接。在C#中實現一個websocket http服務器# – Raynos

回答

0

不幸的是沒有睡覺,或等待,在javascript函數 - 但你可以模擬一個與使用超時和回調。 (通過回調函數「跳轉」到代碼的其餘部分 - 並將調用放入setTimeout方法中)。

編輯:

你可以做這樣的事情,

AJAX = new XMLHttpRequest(); 
var myInterval = setInterval(function(){ 
    AJAX.open("GET", "http://127.0.0.1:8080", false); 
    AJAX.send(null); 
    var ean = AJAX.responseText; 
    if (ean != '') { postMessage(ean); } 
},120); 

現在,如果你不awnt等待第一個電話,把它放在外面的間隔(所以它會立即跑),然後按照上面所述再次調用間隔。

+0

據我所能找到的setTimeout是一個窗口的方法是不可訪問的web工作人員:( – Slavius

+0

看這裏https://developer.mozilla.org/en/using_web_workers 「工作人員可以像主線程那樣使用超時和間隔,例如,如果您希望讓工作線程定期運行代碼而不是不停頓地運行,可以使用這種方法,例如 請參閱setTimeout(),clearTimeout(),setInterval ()和clearInterval()以獲得詳細信息「似乎表明這些函數是可用的,我沒有太多的web工作經驗,所以我不能提供很多幫助,只做一些副作用研究。 – Pantelis

+0

我確實嘗試過使用它,但是無法注意到任何區別,所以我認爲它不起作用,所以我搜索並看到setTimeout屬於窗口對象,並通過查看文檔(某處),我讀取該窗口對象不是網絡工作者可以訪問。無論如何,我會深入研究它。謝謝 – Slavius

1

我認爲最好的解決方案是WebSocket API。因此,您可以在您的Web應用程序中附加事件偵聽器,並在每次需要執行某些操作時從C#中將其啓動。

+0

[AC#websocket服務器實現](http:// superwebsocket.codeplex.com/) – Raynos

+0

我可以想象一個連接中斷時的問題(服務重啓,TCP連接超時等),我希望有一種KeepAlive和DeadPeerDetection,我需要重新註冊事件處理程序嗎?在Linux中實現這個有多難(與簡單的TCP HTTP服務器可以在Perl中完成,Python甚至在Bash中完成對比) – Slavius

+0

讓我們保持簡單請不要使用websocket服務器ru nning ASP.net @ IIS服務器。我們正考慮在非常輕便的工作站上運行這個工作站,並且可以移植到Linux和OS X. – Slavius

相關問題