jerrywang168
發表於 13-1-29 22:05
d大感謝您
我剛剛比過了
沒問題是對的
可以請教您一個問題
您說開另一個WORKING QUEUE 去處理
可以我在目前的THREAD A收到資料時同時先把他存在ARRAY
然後再用另一個THREAD B去讀那ARRAY的值嗎?
同時在THREAD B去作我要作的事
可是您前面提到在單核心下漏TICK狀況較低
這樣用MULTITHREAD效能不是理論上較差
抱歉這部份實在不是很了解
謝謝
dragic
發表於 13-1-29 23:17
jerrywang168 發表於 13-1-29 22:05 static/image/common/back.gif
d大感謝您
我剛剛比過了
單核心不用改NDDE源碼就能不漏
多核心需要改 目前我試的結果似乎是這樣
感覺是DDE這種舊技術在多核心系統效能不佳 所以需要改用多執行緒以及buffer來改善
程式部分
基本上NDDE client本身會自己產生一個thread 所以不用另外再開
而NDDE在client的Advice事件觸發後 所取得到的資料就塞到queue裡面
用一個backgroundworker定期檢查queue裡面有沒有資料 有就處理到queue沒資料為止
jerrywang168
發表於 13-1-30 12:59
dragic 發表於 13-1-29 23:17 static/image/common/back.gif
單核心不用改NDDE源碼就能不漏
多核心需要改 目前我試的結果似乎是這樣
感覺是DDE這種舊技術在多核心 ...
請教您
1.可以指點怎樣叫做QUEUE嗎
該用何種方式實作(我下面是我自己猜的作法 如有不對可以提出較佳作法 謝謝)
2.如果我是某一主程式 A 在執行
另外開一個THREAD B去執行NDDE
照您說是不是這THREAD B就會另開一CLIENT 去讀DDE SERVER資料
我把這些資料放在一ARRAY C
主程式A 有另一THREAD D 定期去POOLING ARRAY C
如有新資料就表示他是要作動作 還是THREAD B 該NOTIFY THREAD D?
可是這樣在單核心狀態執行不是會降低效能讓CPU滿載嗎?
(因為不是開在VM下嗎?)
(還是因為VM本身內部是單核 但是我外部WIN 7 還是用多核在跑 所以他有關繪圖
這部份會往外傳讓WIN 7 多核處理? 抱歉 不是很了解 VM的運作)
3.是不是多核依您說改NDDE 源碼 就可以達到接近不漏TICK
4.還是我這資訊源部份用VM單核跑 把資料外傳(也許用SOCKET OR TEXTFILE)讓在非VM讀
在非VM下是多核心程式(如MC8)這樣來接收傳進來的資料
可是這樣接收端(MC8)會有漏TICK嗎?
謝謝您的耐心指導
jerrywang168
發表於 13-1-31 11:25
D大您好 我改了K大的程式碼
我的作法是
1.直接只開一個Service(CATDDE->E-Leader) Topic -> FUTOPT<FO>TXFB3
當我按btnAddConnect_Click啟動後直接開兩個ITEM(CurPrice, TickVol)
public partial class DDEClientFrm : Form
{
private Hashtable ht_conn; //保存以 (連線字串) 為 key; 所建立的 DdeClient instance 為 object.
//private Hashtable ht_item; //保存以 (連線字串+項目名稱) 為 key; 項目值為 object
private Hashtable ht_gdv; // 保存以 (連線字串+項目名稱) 為 key;
private Queue myQueue = new Queue(); // 保存DDEClient 收到的 Item
public DDEClientFrm()
{
InitializeComponent();
ht_conn = new Hashtable();
//ht_item= new Hashtable();
ht_gdv = new Hashtable();
//Queue myQueue = new Queue();
}
/** 新增 DDE連線 的事件處理
*
*/
private void btnAddConnect_Click(object sender, EventArgs e)
{
if (ht_conn.ContainsKey(txtService.Text + "|" + txtTopic.Text))
{
MessageBox.Show("連線字串不能重覆!");
return;
}
DdeClient dc = new DdeClient(txtService.Text, txtTopic.Text);
//register the event handler
dc.Disconnected += client_Disconnected;
dc.Advise += client_Advise;
try
{
// Connect to the server.It must be running or an exception will be thrown.
dc.Connect();
dgConnection.Rows.Add(txtService.Text, txtTopic.Text, "已連線");
//利用 "service|topic" 為 HashTable 的 Key; DdeClient 為 Object.
string key = txtService.Text + "|" + txtTopic.Text;
ht_conn.Add(key, dc);
}
catch (Exception thrown)
{
MessageBox.Show("無法連結 DDE Server:" + thrown.Message);
}
/* Added By Jerry
* Add Items
* End Added By Jery*/
this.AddItem(dc, "CurPrice"); //新增 Item
this.AddItem(dc, "TickVol"); //新增 Item
}
2. 在 client_Advise 中把收到的item 直接放進myQueue中
private void client_Advise(object sender, DdeAdviseEventArgs args)
{
DdeClient dc = (DdeClient)sender;
ValueItem it = new ValueItem();
it.item = args.Item;
it.value = args.Text;
it.time = DateTime.Now;
myQueue.Enqueue(it);
}
3.目前測試中所以一直讓QUEUE自動增加到我按停止連線同時Output 整個Queue
void BtnStopConnectClick(object sender, EventArgs e)
{
string key = txtService.Text + "|" + txtTopic.Text;
DdeClient client_conn = (DdeClient)ht_conn;
this.Stop_advise(client_conn, "CurPrice");
this.Stop_advise(client_conn, "TickVol");
//刪除所儲存連線資訊的 key/value, 以及將該 DdeClient 連線移除。
ht_conn.Remove(key);
client_conn.Dispose();
//將所在的連線資料列刪除掉
dgConnection.Rows.RemoveAt(0);
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"R:\DDE.txt"))
while (myQueue.Count > 0)
{
ValueItem it = (ValueItem) myQueue.Dequeue();
file.WriteLine(it.item);
file.WriteLine(it.value);
file.WriteLine(it.time);
}
}
jerrywang168
發表於 13-1-31 11:36
D大想請教您
我收到的今天TICK到11:03如附件
我即時看E-LEADER比較方現好像只有92%
我是用i7 加上改了NDDE 的start_advise
只是沒有用單核的VM
我晚點再試看看
請問用Virtual PC 的XP Mode可以嗎?
jerrywang168
發表於 13-2-4 20:46
D大
我今天用VirtualBox 上裝XP SP3 用單核心去跑
在上面同時跑E-LEADER 後
才發現原來我之前在多核心測試的結果和單核結果一樣
是不到50%
因為中間有些只出現VOL 或只出現PRICE
如果你看我上一篇附件就知
可以請教是那出問題嗎
還是要用VM
jerrywang168
發表於 13-2-4 20:47
還是我不能用太大的QUEUE
應該改用ARRAY?
我等下改用ARRAY 明天試看看
jerrywang168
發表於 13-2-4 20:52
請問會是因為ELEADER本身DDE弱嗎
我知道我這樣改一定有點問題
因為之前我用M大的XDDE 收到的比我改的還多TICK
jerrywang168
發表於 13-2-5 23:25
大大我今天用VirtualBox + 寶來點金靈測試
OK 得到和你之前測的結果(基本上非常接近了
TICK數接近 但還沒IMPORT到MC去測試)
只是有一問題為什麼我同樣程式在WIN7下居然抓不到資料
只剩明天可測了
jerrywang168
發表於 13-2-21 20:13
d大您好
經過這幾天的測試
我找到問題了
1.您測試的結果嚴格來說是錯的
怎說呢
因為我和期交所的資料去比後發現
原來真的差很多
請參考這篇T大提供的軟體
http://www.coco-in.net/thread-19125-2-1.html
2.您說連點金靈發現資料正確是對的 這句也是正確
因為資料和點金靈比是一樣的 但實際這資料和期交所比是錯的
好像改NDDE的DLL後 我不論用單核或是多核 結果都可以正確
(明天再來測不改NDDE的DLL)
3.如果不改NDDE的DLL結果也能和點金靈一樣
那表示應該是點金靈的DDE SERVER本身較穩定
其他像ELEADER就不穩定
4.不管怎樣還是謝謝您