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)。。。。
我沒有元大的,
我用日盛的鉅富贏家測試的。。。。


頁: 1 [2] 3
查看完整版本: NDDE 問題與討論