0

イベントメカニズムを介して株式ティックを収集する API (dll) があります。以下のように:

...
using MT4API;

public partial class Blue : Form
{
...
public Blue()   
        {
...
            string symbol = "GBPUSD";
            MT4DDE dde = new MT4DDE("");
            dde.OnQuote += new System.EventHandler<QuoteEventArgs>(MT_OnQuote);
            dde.Connect();
            dde.Subscribe(symbol);
....

アイデアは、チャートの目盛りごとにイベントを取得することです。イベント ハンドラのコードは次のとおりです。

    private static void MT_OnQuote(object sender, QuoteEventArgs args)
    {
        GlobalClass.Ask = args.Ask;
        GlobalClass.Bid = args.Bid;
        // I have back ground worker code that updatestables from the global class
    }

これはすべてうまくいきます。フォーム UI の他のボタンに触れない限り。UI フォームのボタンをクリックするとすぐに... API からイベントを受信しなくなり、UI アプリケーションは正常に機能しますが、API からのデータはありません。

UI からのイベントが、API イベントからのそれ以降のイベントを停止するのはなぜですか?

ここで何が起こっているのですか?または、これを設計する方法の提案はありますか?

4

2 に答える 2

0

私は呼び出しコマンドを使用しようとしましたが、動作しますが、いくつかのイベントの後に停止します...分離されたコードは次のとおりです。

MT4API の使用;

名前空間 WindowsFormsApplication1 { public delegate void UpdateTextCallback(double ask, double bid);

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        string symbol = "GBPUSD";
        MT4DDE dde = new MT4DDE("");
        dde.OnQuote += new EventHandler<QuoteEventArgs>(MT_OnQuote);
        dde.Connect();
        dde.Subscribe(symbol);

    }

    private void updateTickDisplay(double ask, double bid)
    {
        textBox1.Text = ask.ToString();
        textBox2.Text = bid.ToString();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void MT_OnQuote(object sender, QuoteEventArgs args)
    {
        BeginInvoke(new UpdateTextCallback(this.updateTickDisplay),
        new object[] { args.Ask, args.Bid });
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        textBox3.Text = textBox1.Text;
    }

}

}

実際のコードとの唯一の違いは、テキスト フィールドではなく、データ グリッドを使用していることです。しかし、UI が何らかの形で新しいイベントをブロックしていることは明らかです。5 ~ 10 個のイベントが発生した後、停止するのは奇妙です。変。別のデザインに関するアイデアはありますか?

于 2013-01-22T18:47:04.190 に答える
0

グローバル オブジェクトからテーブルを更新するコードをコメント アウトすると、同じ問題が発生しますか? バックグラウンドワーカーをコメントアウトすると?

UI のボタンを押した直後にイベントの発生が停止するのか、記述したコード行が実行された後にのみ発生が停止するのかを区別することをお勧めします

あなたを助けるためには、MT4DDE クラスのイベントがどのようにトリガーされるかを知る必要があります。

このクラスのコードがある場合は、投稿すると役立ちます。

そうでない場合は、Reflector などのツールを使用してアセンブリを C# に逆コンパイルし、イベントの呼び出しを停止する可能性のある MT4DDE クラスの動作を確認することをお勧めします。

さらに、バックグラウンド スレッドに関連することを行っている場合、またはアプリケーションのメイン メッセージ ループで異常なことを行っている場合は、ここで言及することをお勧めします。

于 2013-01-21T23:55:00.560 に答える