When I open more than 1 tab in IE(Chrome or Firefox) then only tab can be streaming data. Others tab is not streaming data. Why?
This is my code in class StockBoardAdapter:
public class StockBoardAdapter : IDataProvider
{
public StructFileManager m_PRSFileStructManager = null;
private IItemEventListener _listener;
private volatile string lstStock = "";
private volatile bool go;
private volatile int temp = 0;
private Global _myGlobal = new Global();
public void Init(IDictionary parameters, string configFile)
{
}
public bool IsSnapshotAvailable(string itemName)
{
return false;
}
public void SetListener(IItemEventListener eventListener)
{
_listener = eventListener;
}
public void Subscribe(string itemName)
{
itemName = itemName.Trim();
_myGlobal._myGlobal = itemName.Substring(4);
Thread t = new Thread(new ThreadStart(Run));
t.Start();
}
public void Unsubscribe(string itemName)
{
itemName = itemName.Trim();
_myGlobal._myGlobal = itemName.Substring(4);
go = false;
}
private void SetData(ref IDictionary eventData, Security i)
{
//eventData["ma_ck"] = i.StockSymbol;
Double gia3=(Double.Parse(i.Best3Bid.ToString())/100);
eventData["gia3"] = gia3.ToString();
eventData["kl3"] = i.Best3BidVolumn.ToString();
Double gia2 = (Double.Parse(i.Best2Bid.ToString()) / 100);
eventData["gia2"] = gia2.ToString();
eventData["kl2"] = i.Best2BidVolumn.ToString();
Double gia1 = (Double.Parse(i.Best1Bid.ToString()) / 100);
eventData["gia1"] = gia1.ToString();
eventData["kl1"] = i.Best1BidVolumn.ToString();
Double gia = (Double.Parse(i.Last.ToString()) / 100);
eventData["gia"] = gia.ToString();
eventData["kl"] = i.LastVol.ToString();
eventData["tong_kl"] = i.LastVol.ToString();
Double gia_1 = (Double.Parse(i.Best1Offer.ToString()) / 100);
eventData["gia_1"] = gia_1.ToString();
eventData["kl_1"] = i.Best1OfferVolumn.ToString();
Double gia_2 = (Double.Parse(i.Best2Offer.ToString()) / 100);
eventData["gia_2"] = gia_2.ToString();
eventData["kl_2"] = i.Best2OfferVolumn.ToString();
Double gia_3 = (Double.Parse(i.Best3Offer.ToString()) / 100);
eventData["gia_3"] = gia_3.ToString();
eventData["kl_3"] = i.Best3OfferVolumn.ToString();
}
public void Run()
{
IDictionary eventData;// = new Hashtable();
go = true;
while (go)
{
eventData = new Hashtable();
if (lstStock == "" && DataAdapterLauncher.lstSec_All != null)
{
lstStock = DataAdapterLauncher.lstStock;
eventData["Items"] = lstStock;
_listener.Update("itemMa", eventData, false);
Thread.Sleep(10000);
foreach (Security i in DataAdapterLauncher.lstSec_All)
{
if (i.StockType.ToUpper() == "U" || i.StockType.ToUpper() == "S")
{
eventData = new Hashtable();
SetData(ref eventData, i);
_listener.Update("item" + i.StockSymbol.ToUpper(), eventData, false);
Thread.Sleep(10);
}
}
System.Console.WriteLine("Local_1_" + temp.ToString());
temp++;
}
else if (DataAdapterLauncher.lstSec_Update != null)
{
foreach (Security i in DataAdapterLauncher.lstSec_Update)
{
if (i.StockType.ToUpper() == "U" || i.StockType.ToUpper() == "S")
{
eventData = new Hashtable();
SetData(ref eventData, i);
_listener.Update("item" + i.StockSymbol.ToUpper(), eventData, false);
}
}
System.Console.WriteLine("Local_2_" + temp.ToString());
temp++;
}
System.Console.WriteLine("Global_1_" + temp.ToString());
temp++;
Thread.Sleep(1000);
}
}
}
public class Global
{
public string _myGlobal="";
and i get data from file Security.DAT (Binary file)...
This is class DataAdapterLauncher:
public class DataAdapterLauncher
{
public static List<Security> lstSec_All = null;
public static List<Security> lstSec_Update = null;
public static string lstStock = "";
//public static byte[] m_CopiedReadSecurities = null;
//public static byte[] m_All = null;
//public static byte[] m_Update = null;
public static string constDataPathFileName = "DATAPATH.MAP", constDataPathTempFileName = "DATAPATH1.MAP";
public static void Main(string[] args)
{
//string host = "125.234.15.210";
string host = Commons.GetConfigKey("server_add");
int reqrepPort = 3333;
int notifPort = 4444;
try
{
DataProviderServer server = new DataProviderServer();
server.Adapter = new StockBoardAdapter();
TcpClient reqrepSocket = new TcpClient(host, reqrepPort);
server.RequestStream = reqrepSocket.GetStream();
server.ReplyStream = reqrepSocket.GetStream();
TcpClient notifSocket = new TcpClient(host, notifPort);
server.NotifyStream = notifSocket.GetStream();
server.Start();
Thread t = new Thread(new ThreadStart(GetData));
t.Start();
System.Console.WriteLine("Remote Adapter connected to Lightstreamer Server.");
System.Console.WriteLine("Ready to publish data...");
}
catch (Exception e)
{
System.Console.WriteLine("Could not connect to Lightstreamer Server.");
System.Console.WriteLine("Make sure Lightstreamer Server is started before this Adapter.");
System.Console.WriteLine(e);
}
}
public static void NumOfStock(List<Security> lstSec)
{
foreach (Security i in lstSec)
{
if (i.StockType.ToUpper() == "U" || i.StockType.ToUpper() == "S")
{
if (lstStock == "")
lstStock += i.StockSymbol.ToUpper();
else
lstStock += "|" + i.StockSymbol.ToUpper();
}
}
}
public static void GetData()
{
bool l_IsTodays = false;
string m_PRS_Root_Path = GetConfigKey("PRS_Root"), m_PRS_File_Path = "";
l_IsTodays = ReadDataPathFile(m_PRS_Root_Path, ref m_PRS_File_Path);
byte[] m_CopiedReadSecurities = null;
byte[] m_All = null;
byte[] m_Update = null;
while (true)
{
try
{
FileInfo l_FileInfo = new FileInfo(m_PRS_File_Path + "\\\\SECURITY.DAT");
m_All = ReadFileSpecial(l_FileInfo.FullName, 0, l_FileInfo.Length);
lstSec_All = Security.GetSecuritiesEntities(m_All);
if (lstStock == "")
NumOfStock(lstSec_All);
if (m_CopiedReadSecurities==null)
m_All = GetUpdatedSecuritiesRecords(l_FileInfo, ref m_CopiedReadSecurities);
m_Update = GetUpdatedSecuritiesRecords(l_FileInfo, ref m_CopiedReadSecurities);
if (m_Update != null && m_Update.Length>0)
lstSec_Update = Security.GetSecuritiesEntities(m_Update);
m_All = null;
m_Update = null;
}
catch
{
}
Thread.Sleep(1000);
}
}
public static bool ReadDataPathFile(string m_PRS_Root_Path, ref string m_PRS_File_Path)
{
//READ DATAPATH.MAP FILE GET ALL DATA INSERT TO HASHTABLE
string l_StrDATAPATH = "";
try
{
FileStream l_FileStream = new FileStream(m_PRS_Root_Path + "\\" + constDataPathFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamReader l_StreamReader = new StreamReader(l_FileStream);
l_StrDATAPATH = l_StreamReader.ReadLine();
l_StreamReader.Close();
l_FileStream.Close();
}
catch (IOException ex)
{
//WriteLog("IO Exception", ex.Message + "\r\n" + ex.StackTrace, Commons.m_excepLog);
}
Hashtable l_HashTable = new Hashtable();
int l_StrLen = l_StrDATAPATH.Length;
int l_Index = 0;
while (l_Index < l_StrLen)
{
string l_StrTemp = l_StrDATAPATH.Substring(l_Index, 18);
if (l_HashTable.Contains(l_StrTemp.Substring(0, 10)))
l_HashTable.Remove(l_StrTemp.Substring(0, 10));
l_HashTable.Add(l_StrTemp.Substring(0, 10), l_StrTemp.Substring(10));
l_Index = l_Index + 18;
}
string l_StrToDay = DateTime.Now.ToString("dd") + "/" + DateTime.Now.ToString("MM") + "/" + DateTime.Now.ToString("yyyy");
//WriteLog
if (l_HashTable.Contains(l_StrToDay))
{
m_PRS_File_Path = String.Concat(m_PRS_Root_Path, "\\");
m_PRS_File_Path = String.Concat(m_PRS_Root_Path, l_HashTable[l_StrToDay].ToString());
return true;
}
else
{
return false;
}
}
public static string GetConfigKey(string key)
{
try
{
if (key.Trim() != "" || ConfigurationManager.AppSettings[key.Trim()] != null)
return ConfigurationManager.AppSettings[key.Trim()].ToString();
else
return key.Trim();
}
catch (Exception ex)
{
return key;
}
}
public static byte[] GetUpdatedSecuritiesRecords(FileInfo pFileInfo,ref byte[] m_CopiedReadSecurities)
{
try
{
byte[] l_Ret = null;
byte[] l_NewSecurity = null;
l_NewSecurity = ReadFileSpecial(pFileInfo.FullName, 0, pFileInfo.Length);
int l_RecLen = Security.constSTC_RECORD_LENGTH;
int l_Len = 0;
if (l_NewSecurity != null)
l_Len = l_NewSecurity.Length;
if (m_CopiedReadSecurities != null && l_Len > 0)
{
int[] l_RecIdx = new int[l_Len / l_RecLen]; // Array of record indexes of those are actually changed
int l_NumChangedRecs = 0;
// Find indexes of records that are actually changed
for (int i = 0; i < l_Len; i++)
{
if (m_CopiedReadSecurities[i] != l_NewSecurity[i])
{
l_RecIdx[l_NumChangedRecs] = i / l_RecLen;
i = ((l_RecIdx[l_NumChangedRecs] + 1) * l_RecLen) - 1; // Move up to compare the subsequent record
l_NumChangedRecs++;
}
}
// Copy the changed records into the array to be returned
l_Ret = new byte[l_NumChangedRecs * l_RecLen];
for (int i = 0; i < l_NumChangedRecs; i++)
{
// Copy record of index RecIdx[i] into the returned array
int k = i * l_RecLen;
int j = l_RecIdx[i] * l_RecLen;
for (int cnt = 0; cnt < l_RecLen; cnt++, k++, j++)
{
l_Ret[k] = l_NewSecurity[j];
}
}
}
else
{
l_Ret = l_NewSecurity; // There is no copied of SECURITY.DAT in memory, so just return the whole content
}
// Save the content of SECURITY.DAT
m_CopiedReadSecurities = l_NewSecurity;
return l_Ret;
}
catch (Exception ex)
{
Commons.WriteLog("UpdateSecurityRecord", ex.Message + "\r\n" + ex.StackTrace, Commons.m_excepLog);
return null;
}
}
public static byte[] ReadFileSpecial(string pFullFileName, long pStartPos, long pNumBytes)
{
try
{
return ReadFileAppend(pFullFileName, pStartPos, pNumBytes);
}
catch (IOException ioex)
{
Commons.WriteLog("ReadSpecialIO", "***** ReadFileSpecial IOException:" + ioex.Message, Commons.m_excepLog);
return null;
}
catch (Exception ex)
{
Commons.WriteLog("ReadSpecialEx", "***** ReadFileSpecial IOException:" + ex.Message, Commons.m_excepLog);
return null;
}
}
public static byte[] ReadFileAppend(string p_FileName, long p_StartPos, long p_NumBytes)
{
byte[] hByt = new byte[p_NumBytes];
try
{
FileStream l_FileStream = new FileStream(p_FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
BinaryReader l_BinaryReader = new BinaryReader(l_FileStream);
l_FileStream.Seek(p_StartPos, SeekOrigin.Begin);
l_BinaryReader.Read(hByt, 0, (int)p_NumBytes);
l_BinaryReader.Close();
l_FileStream.Close();
return hByt;
}
catch (UnauthorizedAccessException ex)
{
Commons.WriteLog("ReadFileAppend_UnauthorizedAccessException", ex.Message, Commons.m_excepLog);
return null;
}
catch (Exception ex)
{
Commons.WriteLog("ReadFileAppend", ex.Message, Commons.m_excepLog);
return null;
}
}
}
and this is index.htm:
<html>
<head>
<title>Stock Board with Lightstreamer</title>
<link rel="stylesheet" type="text/css" href="css/table.css" />
<script language="JavaScript" src="LS/lscommons.js"></script>
<script language="JavaScript" src="LS/lspushpage.js"></script>
<script src="scriptaculous/prototype.js" type="text/javascript"></script>
<script src="scriptaculous/scriptaculous.js?load=slider" type="text/javascript"></script>
</head>
<body>
<!--MyCode-->
<!-- stock table -->
<table width="766" border="0">
<tr>
<td><a href="http://www.lightstreamer.com" target="_blank">
<img src="images/logo.gif" alt="LIGHTSTREAMER" hspace="0" border="0" /></a></td>
<td class="demoTitle">STOCK-LIST DEMO</td>
</tr>
</table>
<div id="dvStatus"></div>
<br />
<table border="0">
<tr>
<td colspan="2" id="hlc" class="note" style="text-align:left;font-weight:bold;">Highlight Color</td>
</tr>
<tr>
<td colspan="2">
<div class="slideLine" id="selectColor">
<div class="blueCursor" id="selectBlue"> </div>
<div class="greenCursor" id="selectGreen"> </div>
<div class="redCursor" id="selectRed"> </div>
</div>
</td>
</tr>
</table>
<form name="myForm">
<input type="hidden" name="hiddencount" value="1" />
</form>
<table><div source="lightstreamer" table="a" item="item0" field="Count" style="display: none"></div></table>
<table id = "stocks" cellspacing="0" cellpadding="2" width="766" border="0" >
<tr class="tableTitle">
<td width="200" style="text-align: left">Ma CK</td>
<td width="100">Gia 3</td>
<td width="100">KL 3</td>
<td width="100">Gia 2</td>
<td width="100">KL 2</td>
<td width="100">Gia 1</td>
<td width="100">KL 1</td>
<td width="150">Gia</td>
<td width="100">KL</td>
<td width="150">Tong KL</td>
<td width="100">Gia 1</td>
<td width="100">KL 1</td>
<td width="100">Gia 2</td>
<td width="100">KL 2</td>
<td width="100">Gia 3</td>
<td width="100">KL 3</td>
<td width="100">Thoi Gian</td>
</tr>
<script>
//var schema1 =["Count"];
var schema =["gia3", "kl3", "gia2", "kl2", "gia1", "kl1", "gia", "kl", "tong_kl", "gia_1", "kl_1", "gia_2", "kl_2", "gia_3", "kl_3","time"];
var page1 = ["itemMa"];
var schema1=["Items"];
var flag = true;
var imgUp = '<img src="images/quotes_up.gif" alt="up" width="20" height="8" border="0">';
var imgDown = '<img src="images/quotes_down.gif" alt="down" width="20" height="8" border="0">';
var doFade = false;
var hotColor = "#f29e05";
var redColor = "#f8b87a";
var greenColor = "lightgreen";
var page = new PushPage();
page.onEngineCreation = function(engine) {
engine.connection.setAdapterName("PROXY_HELLOWORLD");
engine.changeStatus("STREAMING");
}
page.bind();
page.createEngine("HelloWorldApp", "LS", "SHARE_SESSION");
var pushtable = new OverwriteTable(page1, schema1, "MERGE");
pushtable.onItemUpdate = updateItem1;
page.onEngineReady = function(lsEngine) {
lsEngine.onStatusChange = function(newStatus) {
ShowStatus(newStatus, page.isMasterPushPage());
};
// take the current engine status into account
lsEngine.onStatusChange(lsEngine.getStatus());
};
page.onEngineLost = function() {
ShowStatus("WAITING FOR ENGINE...", true);
};
function updateItem1(item,updateInfo) {
if (updateInfo.isValueChanged("Items")){
var ars = updateInfo.getNewValue("Items").split('|');
if(ars != null){
if((parseInt(document.myForm.hiddencount.value) < ars.length)&&(flag)){
var page1Group = new Array(ars.length);
for(var i = 0;i<=ars.length-parseInt(document.myForm.hiddencount.value);i++){
addRow('stocks',i, ars[i]);
page1Group[i]="item"+ars[i];
}
page = new PushPage();
page.onEngineCreation = function(engine) {
engine.connection.setAdapterName("PROXY_HELLOWORLD");
engine.changeStatus("STREAMING");
}
}
page.bind();
pushtable = new OverwriteTable(page1Group, schema, "MERGE");
pushtable.setSnapshotRequired(true);
pushtable.setRequestedMaxFrequency(1.0);
pushtable.setPushedHtmlEnabled(true);
// set highlighting effect when updating a cell
pushtable.onChangingValues = function(itemPos, visualUpdateInfo, itemName) {
if (visualUpdateInfo != null) {
var cold = (itemPos % 2 == 1) ? "#eeeeee" : "#ddddee";
if(visualUpdateInfo !="#arrow")
visualUpdateInfo.setRowAttribute(hotColor, cold, "backgroundColor");
}
};
pushtable.onItemUpdate = updateItem;
page.addTable(pushtable, "stocks");
flag = false;
}
}
}
page.addTable(pushtable, "a");
//add row table
function addRow(tableID,i,itemID) {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
var row = table.insertRow(rowCount);
var suff = (i % 2 == 0) ? "A" : "B";
var cell0 = row.insertCell(0);
cell0.innerHTML ='<td nowrap style="text-align: left"><a href="#"><img src="images/popup.gif" width="16" height="16" border="0" align="left" hspace="1" alt="Graphic Chart"><div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item'+ itemID +'" field="ma_ck">' + itemID + '</div></a></td>';
var cell1 = row.insertCell(1);
cell1.innerHTML ='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item'+ itemID +'" field="gia3">-</div>';
var cell2 = row.insertCell(2);
cell2.innerHTML ='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="kl3">-</div>';
var cell3 = row.insertCell(3);
cell3.innerHTML ='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="gia2">-</div>';
var cell4 = row.insertCell(4);
cell4.innerHTML ='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="kl2">-</div>';
var cell5 = row.insertCell(5);
cell5.innerHTML ='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="gia1">-</div>';
var cell6 = row.insertCell(6);
cell6.innerHTML ='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="kl1">-</div>';
var cell7 = row.insertCell(7);
cell7.innerHTML ='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="gia">-</div>';
var cell8 = row.insertCell(8);
cell8.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="#kl">-</div>';
var cell9 = row.insertCell(9);
cell9.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="tong_kl">-</div>';
var cell10 = row.insertCell(10);
cell10.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="gia_1">-</div>';
var cell11 = row.insertCell(11);
cell11.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="kl_1">-</div>';
var cell12 = row.insertCell(12);
cell12.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="gia_2">-</div>';
var cell13 = row.insertCell(13);
cell13.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="kl_2">-</div>';
var cell14 = row.insertCell(14);
cell14.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="gia_3">-</div>';
var cell15 = row.insertCell(15);
cell15.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="kl_3">-</div>';
var cell16 = row.insertCell(16);
cell16.innerHTML='<div class="stockname'+suff+'" source="lightstreamer" table="stocks" item="item' + itemID + '" field="time">-</div>';
}
///(Optional) Block Escape Key
document.onkeydown = checkEscape;
document.onkeypress = checkEscape;
function checkEscape(e) {
if(!e) e = event;
if(e.keyCode == 27) return false;
}
/////////////////////
if (location.search.indexOf("fade=ON") > -1) {
doFade = true;
}
//////////////// Event Handlers for the Stock Table
function updateItem(item, updateInfo) {
if (updateInfo == null) {
return;
}
// check for a void update, so as to ignore it;
// the case is possible when testing the Remote version of the Data Adapter
// in bundle with the Robust version of the Proxy Adapter
if(updateInfo.isValueChanged("tong_kl")&&(updateInfo.getOldValue("tong_kl")!=null)){
var kl = (updateInfo.getNewValue("tong_kl") - updateInfo.getOldValue("tong_kl"));
var test = '<div>'+kl.toFixed(2)+'</div>';
updateInfo.addField("#kl",test);
}
}
var colValues = new Array();
for (var x = 0; x <= 255; x++) {
colValues[colValues.length] = x;
}
new Control.Slider(['selectRed','selectGreen','selectBlue'],'selectColor',{sliderValue :Smile_Ah: 242,158,5],range:$R(0,255),step:1,increment:1,values:colValues,
onChange:function(v){
updateColInd(v);
},
onSlide:function(v){
updateColInd(v);
}});
document.getElementById("selectColor").style.backgroundColor = hotColor;
document.getElementById("hlc").style.color = hotColor;
function updateColInd(v) {
var colArr = v.toArray();
var applyCol = "rgb("+colArr[0]+","+colArr[1]+","+colArr[2]+")";
document.getElementById("selectColor").style.backgroundColor = applyCol;
document.getElementById("hlc").style.color = applyCol;
hotColor = applyCol;
}
//////////////// Stock Details Popup Management
var unique = Math.floor(Math.random() * 1000);
function openPopup(row,length) {
var Group = new Array(length);
for(var i = 0;i<=length;i++){
Group[i] = "item"+(i+1);
}
var item = Group[row-1];
var fadeStr = "";
if (doFade)
{
fadeStr = "&fade=ON";
}
wdt = window.open("popup.html?item=" + item + fadeStr, "SLDpopup_" + unique + "_" + item, "width=600,height=400,history=0,resizable,status=1,menubar=1");
wdt.focus();
return false;
}
function ShowStatus(content){
document.getElementById('dvStatus').innerHTML = content;
};
</script>
</table>
</body>
</html>
I don't know why only 1 tab have data...
There are 2 pictures