frantz
發表於 16-6-7 18:02
kuolung 發表於 16-6-3 22:49
依我的經驗值,一次抓 500檔股票,DDE 是可以的
我目前用 華南 E指發 經 TSTW 轉 1300檔股票給 TS , 感覺上 ...
kuolung大
3.4G的DATA滿多的
請問一下這個您是怎麼規畫的?
Server
Topic_name
Item_name
這會先分組三種資料庫建立起來嗎?
後續記錄時,應該是連結資料庫去匯整
資料庫部份你是建那一種的??
ass還是txt檔??
frantz
發表於 16-6-7 23:25
kuolung 發表於 16-6-7 20:34
說到 advise 的寫法要注意,程式不能太長,佔用太多cpu時間,不然會有同步的問題,
因為您的程式還沒有處 ...
謝謝kuolung大
續上述分三組記錄這部份及這個問題
所以我現在除了UI上要呈現什麼外
在data上這三組適合用什麼方式建立??
用TXT→INI去抓嗎?
還是建立在ASS上後,在讀取。
上述這些成立了
接下來語法上您有提到不能太長
我聯想到的是
是不是應該用成共用的xxx[] topic = new xxx(){}及xxx[] item = new xxx(){}放在
StartAdvise()
StopAdvise()
client_Advise()
在用try、if 及 for
這上面三組去RUN
後續還要製作一個dispose()
ilybydlm
發表於 16-6-8 09:49
小弟也來貢獻一下,重點的確是client_Advise沒錯
private void client_Advise(object sender, NDde.Client.DdeAdviseEventArgs args)
{
int codepage = Encoding.Default.CodePage;
dic.Text = Encoding.GetEncoding(codepage).GetString(args.Data, 0, args.Data.Length);
}
其中dic是一個Dictionary<string,label>,用來存放畫面上的每一個市場價格label
string放的是DDE的代號,例如A50就是SCN1606.SIMEX.Price
這樣的好處是未來新增市場時,只要去dic裡面新增即可
frantz
發表於 16-6-8 10:57
謝謝kuolung大及ilybydlm大
昨日有重新研究一下去try按鑑button1後先出現圖二訊息後
在跳出連線狀況
連線後,數據其是呈現靜態,非動態。
嘗試在上網查詢相關資料修正,還是有相同訊息出來。。。。。
此部份還需要請兩位大方便的話,
能否多跟你們請益呢。
寫法如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using NDde.Client;
namespace TradeDDE
{
public partial class TDControl : Form
{
//private DdeClient client;
private Hashtable ht_conn;
private Hashtable ht_connitem;
//private Hashtable ht_itemvalue;
public string data = null;
public TDControl()
{
InitializeComponent();
ht_conn = new Hashtable();
ht_connitem = new Hashtable();
// ht_itemvalue = new Hashtable();
//client = new DdeClient( "","" );
}
private void TDControl_Load(object sender, EventArgs e)
{
}
/**新增 DDE連線的事件處理**/
private void button1_Click(object sender, EventArgs e)
{
DdeClient client = new DdeClient("MMSDDE", "FUSA");
if (ht_conn.ContainsKey(client))
{
MessageBox.Show("已連線不能重複登入!");
return;
}
client.Disconnected += client_Disconnected;
client.Advise += client_Advise;
try
{
client.Connect();
label1.Text = "已連線";
string key = "MMSDDE"+"|"+"FUSA";
ht_conn.Add(key, client);
}
catch(Exception thrown)
{
MessageBox.Show("無法連結DDE伺服器:" + thrown.Message);
}
DdeClient dc = (DdeClient)ht_connitem;
string item = "B1YM&.125";
this.AddItem(dc, item);
string abc;
abc = client.Request(item, 10000);
client.StartAdvise(item, 1, true, 10000);
client.Advise += client_Advise;
decimal lab;
lab = Convert.ToDecimal(abc);
lab = decimal.Parse(abc);
label2.Text = abc;
int abcd = dataGridView1.Rows.Add(abc);
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0 ||(e.ColumnIndex != dataGridView1.Columns["Col_item"].Index &&e.ColumnIndex != dataGridView1.Columns["Col_del"].Index))
return;
DataGridViewRow del_row = dataGridView1.Rows;
DdeClient client = new DdeClient("MMSDDE", "FUSA");
DdeClient dc = (DdeClient)ht_connitem;
string stop_item = del_row.Cells["Col_item"].Value.ToString();
this.Stop_advise(dc,stop_item);
string service_topic_item = client + "!" + stop_item;
DataGridViewRow del_item_row = (DataGridViewRow)ht_connitem;
ht_connitem.Remove(service_topic_item);
dataGridView1.Rows.Remove(del_item_row);
dataGridView1 = null;
return;
}
//Stop Advise
private void Stop_advise(DdeClient dc, string item)
{
try
{
dc.StopAdvise(item, 10000);
}
catch (Exception thrown)
{
MessageBox.Show("停止更新: \n" + thrown.Message);
}
}
private void Dictionary(string Label)
{
Label L = new Label();
}
private void client_Advise(object sender, DdeAdviseEventArgs args)
{
//Console.WriteLine("OnAdvise:" + args.Text);
DdeClient dc = (DdeClient)sender;
string key = dc.Service + "|" + dc.Topic + "!" + args.Item;
//Item it = new Item();
//it.item = args.Item; it.value = "";
//Hashtable ht_connitem = new Hashtable();
DataGridViewRow chg_value_row = (DataGridViewRow)ht_connitem;
chg_value_row = null;
return ;
int codepage = Encoding.Default.CodePage;
string data = Encoding.GetEncoding(codepage).GetString(args.Data, 0, args.Data.Length);
chg_value_row.Cells["Col_item"].Value = data;
label2.Text = data;
}
private void AddItem(DdeClient dc, string item)
{
try
{
string key = dc.Service + "|" + dc.Topic + "!" + item;
Item it = new Item();
it.item = item; it.value = "";
try
{
byte[] data = dc.Request(item, 1, 10000);
int codepage = Encoding.Default.CodePage;
string value = Encoding.GetEncoding(codepage).GetString(data, 0, data.Length);
it.value = value;
}
catch (Exception)
{
;
}
dc.StartAdvise(item, 1, true, 10000);
int idx = dataGridView1.Rows.Add(it.value);
ht_conn.Add(key, dataGridView1.Rows);
label2.Text = it.value;
}
catch (Exception thrown)
{
MessageBox.Show("無法新增項目:\n" + thrown.Message);
}
}
private void Remove_Connect_and_Item_Row(int row_idx)
{
DataGridViewRow del_row = dataGridView1.Rows;
string key = del_row.Cells["Col_item"].Value.ToString();
DdeClient client_conn = (DdeClient)ht_connitem;
ArrayList list = new ArrayList();
foreach (DictionaryEntry del in ht_connitem)
{
string item_key = del.Key.ToString();
string item_key_substr = item_key.Substring(0, item_key.IndexOf("!"));
if(key.Equals(item_key_substr))
{
DataGridViewRow del_item_row = (DataGridViewRow)del.Value;
string item = del_item_row.Cells["Col_item"].Value.ToString();
this.Stop_advise(client_conn, item);
list.Add(item_key);
}
}
foreach(string str_key in list)
{
DataGridViewRow del_item_row = (DataGridViewRow)ht_connitem;
ht_connitem.Remove(str_key);
dataGridView1.Rows.Remove(del_item_row);
}
ht_connitem.Remove(key);
client_conn.Dispose();
dataGridView1.Rows.RemoveAt(row_idx);
}
public void Connect(string service, string topic)
{
service = "MMSDDE";
topic = "FUSA";
DdeClient client = new DdeClient(service, topic);
client.Disconnected += client_Disconnected;
client.Advise += client_Advise;
try
{
client.Connect();
this.startAdvise(client);
}
catch (Exception thrown)
{
throw new Exception("無法連結DDE SERVER \n" + thrown.Message);
}
}
private void startAdvise(DdeClient client)
{
//Advise Loop
client.StartAdvise("B1YM&.125", 1, true, 60000);
client.Advise += client_Advise;
}
private void client_Disconnected(object sender, DdeDisconnectedEventArgs args)
{
string msg =
"OnDisconnected: " +
"IsServerInitiated=" + args.IsServerInitiated.ToString() + " " +
"IsDisposed=" + args.IsDisposed.ToString();
//可實做將該訊息顯示在 StatusBar 上.
}
private void label1_Click(object sender, EventArgs e)
{
}
}
}
ilybydlm
發表於 16-6-8 11:56
frantz 發表於 16-6-8 10:57
謝謝kuolung大及ilybydlm大
昨日有重新研究一下去try按鑑button1後先出現圖二訊息後
在跳出連線狀況
建議你先從dde最基本的功能寫起,再加入datagridview等功能
只需要宣告DdeClient,連線,宣告client_Advise事件,去測試一個label是否能夠持續跳動
另外給你一個小提醒,建議把DdeClient設為全域變數,不然可能會隨著時間被清掉喔!!!
frantz
發表於 16-6-8 12:24
ilybydlm 發表於 16-6-8 11:56
建議你先從dde最基本的功能寫起,再加入datagridview等功能
只需要宣告DdeClient,連線,宣告cl ...
謝謝ilydydlm大
目前正在TRY中。。。。
晚點來把DdeClient調整一下位置。。。
感恩~
frantz
發表於 16-6-8 12:24
ilybydlm 發表於 16-6-8 11:56
建議你先從dde最基本的功能寫起,再加入datagridview等功能
只需要宣告DdeClient,連線,宣告cl ...
目前會先著手重新在寫一次一個個觀察。
frantz
發表於 16-6-14 09:57
近日重新編寫
try了之後,不曉得是那邊有問題
需要請kuolung大及ilybydlm大協助檢視一下是那裡不對了。我的寫法如下:參考了ilybydlm大的建議:
嘗試套入Dictionary<string, Label> dic = new Dictionary<string, Label>();這個寫法。
但不曉得有沒有寫錯,因為會跳出圖三的訊息。。。。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using NDde.Client;
/** 2016/06/09 00:23 今日先學習建立DDEClient→連線→Client_Advise至label可以更新數據。*/
/**1.建立struct.cs //分別建立Service、Topic、Item類別,屬全域宣告*/
namespace VCDDEClient
{
public partial class CVDDEClient : Form
{
Dictionary<string, Label> dic = new Dictionary<string, Label>();
//IDictionary dic = new Dictionary<string, Label>();
// public DdeClient client ;
// public Service service_name;
// public Topic topic_name;
// public Item item_name;
//public Item item_digital;
private Hashtable ht_conn;
public CVDDEClient()
{
InitializeComponent();
// client = new DdeClient("MMSDDE","FUSA");
// service_name = new Service();
// topic_name = new Topic();
// item_name = new Item();
ht_conn = new Hashtable();
}
private void CVDDEClient_Load(object sender, EventArgs e)
{
string[] ewords = new string[] { "B1YM&.125", };
Label[] cwords = new Label[] { label2, };
for (int i = 0; i < cwords.Length; i++)
{
dic.Add(ewords, cwords);
}
// dic.Add("B1YM&.125", label2);
// try
// {
// dic.Add("B1YM&.125", label2);
// }
// catch (KeyNotFoundException ex)
// {
// Console.WriteLine("沒有找到鍵引發異常:" + ex.Message);
//}
}
/**------------------------我是分格線---------------------
*新增DDE連線事件處理
*/
private void btn1_Click(object sender, EventArgs e)
{
//if (btn1_Click != new EventHandler(btn1_Click) )
//if(ht_conn.ContainsKey(client))
if (ht_conn.ContainsKey("MMSDDE"+"|"+"FUSA"))
{
MessageBox.Show("不能重複連線");
return;
}
DdeClient dc = new DdeClient("MMSDDE", "FUSA");
dc.Disconnected += client_Disconnected;
dc.Advise += client_Advise;
try
{
dc.Connect();
label1.Text = "已連線";
string item = "B1YM&.125";
string runkey = "MMSDDE" + "|" + "FUSA" + "!" + item;
ht_conn.Add(runkey, dc);
DdeClient key = (DdeClient)ht_conn;
Item it = new Item();
it.item = item; it.value = "";
try
{
byte[] data = dc.Request(item, 1, 10000);
int codepage = Encoding.Default.CodePage;
string value = Encoding.GetEncoding(codepage).GetString(data, 0, data.Length);
it.value = value;
}
catch (Exception)
{
;
}
dc.StartAdvise(item, 1, true, 10000);
label2.Text = it.value;
}
catch(Exception thrown)
{
MessageBox.Show("無線連結DDE伺服器:" + thrown.Message);
}
//dic.Add("B1YM&.125", label2);
string[] ewords = new string[] { "B1YM&.125", };
Label[] cwords = new Label[] { label2, };
for (int i = 0; i < cwords.Length; i++)
{
dic.Add(ewords, cwords);
}
}
//Stop Advise
private void Stop_advise(DdeClient dc, string item)
{
try
{
dc.StopAdvise(item, 10000);
}
catch (Exception thrown)
{
MessageBox.Show("Can not Stop Advise: \n" + thrown.Message);
}
}
/**★★★★★--------設計的重點------------★★★★★
* 建立client_Advise
*/
private void client_Advise(object sender , DdeAdviseEventArgs args)
{
//DdeClient dc = (DdeClient)sender;
//string key = dc.Service + "|" + dc.Topic + "!" + args.Item;
// DdeClient dc = (DdeClient)sender;
// string key = "MMSDDE" + "|" + "FUSA" + "!" + args.Item;
// DdeClient label = (DdeClient)ht_conn;
int codepage = Encoding.Default.CodePage;
//string data = Encoding.GetEncoding(codepage).GetString(args.Data, 0, args.Data.Length);
dic.Text = Encoding.GetEncoding(codepage).GetString(args.Data, 0, args.Data.Length);
}
private void client_Disconnected(object sender, DdeDisconnectedEventArgs args)
{
string msg=
"OnDisconnected: " +
"IsServerInitiated=" + args.IsServerInitiated.ToString() + " " +
"IsDisposed=" + args.IsDisposed.ToString();
//可實做將該訊息顯示在 StatusBar 上.
}
}
}
ilybydlm
發表於 16-6-14 12:02
frantz 發表於 16-6-14 09:57
近日重新編寫
try了之後,不曉得是那邊有問題
需要請kuolung大及ilybydlm大協助檢視一下是那裡不對了。我的 ...
1.試著把btn1_Click的東西寫到CVDDEClient_Load裡面,換言之就是打開winform就直接執行
2.如果上述方法依舊不成功,先試著把Dictionary拿掉,Advise直接控制winform上面的label.Text試試看!
frantz
發表於 16-6-14 14:27
ilybydlm 發表於 16-6-14 12:02
1.試著把btn1_Click的東西寫到CVDDEClient_Load裡面,換言之就是打開winform就直接執行
2.如果上述方法 ...
謝謝ilybydlm大
我在試看看。
frantz
發表於 16-6-16 18:09
本帖最後由 frantz 於 16-6-16 18:21 編輯
kuolung 發表於 16-6-15 00:13
剛剛,我用 YESWIN 測,是 OK 的,
您先把 154 註解掉,改用 151收 advise
謝謝kuolunh大
我目前正在想辦法
嘗試用了
Form.CheckForIllegalCrossThreadCalls = False
這方式可行的,但不清楚會有什麼問題發生。
現在正在研究要不要用↓這兩種方式去排除問題。
1.BackgroundWorker
2.建立委派(Delegate)
ilybydlm
發表於 16-6-17 09:38
先貼一個"最精簡"可以讓LABEL跳動的程式碼上來看看
不然可能發生的問題太多了,無法找出真正原因
frantz
發表於 16-6-17 16:02
kuolung 發表於 16-6-17 00:22
不太了解 你的問題耶明明 advise 已經收到 event
為什麼還要用 你說的 1 2來解決 ...
Kuolung大不知道是不是因為作業系統的關係
我用win10環境下使用vs2015去寫的。
除了使用啟用但不偵錯,或者寫那一串才不會發生問題。
要不然在try時,就是會跳出那個訊息(只要有跳動數據時,就會發生)
從上面的訊號去google查一下,就是嘗試用1或2去排除這樣的問題發生。
frantz
發表於 16-6-17 16:13
ilybydlm 發表於 16-6-17 09:38
先貼一個"最精簡"可以讓LABEL跳動的程式碼上來看看
不然可能發生的問題太多了,無法找出真正原因
ilybydlm大
以下是測試的程式碼。。 。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using NDde.Client;
/** 2016/06/09 00:23 今日先學習建立DDEClient→連線→Client_Advise至label可以更新數據。*/
/**1.建立struct.cs //分別建立Service、Topic、Item類別,屬全域宣告*/
namespace VCDDEClient
{
public partial class CVDDEClient : Form
{
DdeClient dc = new DdeClient("MMSDDE", "FUSA");
string item = "B1YM&.125";
private Hashtable ht_conn;
public CVDDEClient()
{
InitializeComponent();
ht_conn = new Hashtable();
}
private void CVDDEClient_Load(object sender, EventArgs e)
{
}
/**------------------------我是分格線---------------------
*新增DDE連線事件處理
*/
private void btn1_Click(object sender, EventArgs e)
{
if (ht_conn.ContainsKey("MMSDDE"+"|"+"FUSA"))
{
MessageBox.Show("不能重複連線");
return;
}
dc.Disconnected += client_Disconnected;
dc.Advise += client_Advise;
try
{
dc.Connect();
label1.Text = "已連線";
string runkey = "MMSDDE" + "|" + "FUSA" + "!" + item;
ht_conn.Add(runkey, dc);
DdeClient key = (DdeClient)ht_conn;
Item it = new Item();
it.item = item; it.value = "";
try
{
byte[] data = dc.Request(item, 1, 10000);
int codepage = Encoding.Default.CodePage;
string value = Encoding.GetEncoding(codepage).GetString(data, 0, data.Length);
it.value = value;
label2.Text = it.value;
}
catch (Exception)
{
;
}
dc.StartAdvise(item, 1, true, 10000);
}
catch(Exception thrown)
{
MessageBox.Show("無線連結DDE伺服器:" + thrown.Message);
}
}
/**★★★★★--------設計的重點------------★★★★★
private void client_Advise(object sender, DdeAdviseEventArgs args)
{
int codepage = Encoding.Default.CodePage;
label2.Text = Encoding.GetEncoding(codepage).GetString(args.Data, 0, args.Data.Length);
}
private void client_Disconnected(object sender, DdeDisconnectedEventArgs args)
{
string msg =
"OnDisconnected: " +
"IsServerInitiated=" + args.IsServerInitiated.ToString() + " " +
"IsDisposed=" + args.IsDisposed.ToString();
//可實做將該訊息顯示在 StatusBar 上.
}
frantz
發表於 16-6-17 18:26
kuolung 發表於 16-6-17 17:13
我也是用 win 10 (企業版) + vs 2015 (Enterprise) 都是用 64bit 版的,
也沒有您說的問題??
我是用vs 2015(community)。。。。
我沒有元大的,
我用日盛的鉅富贏家測試的。。。。