記事"グラフィカルインタフェースX:リストとテーブルの高度な管理コードの最適化(ビルド7)"についてのディスカッション - ページ 3

 

Tol、これは適切なトピックではないことに気づいていますが、最新のアップデート以来...。

一般的に:かなり前に気づいたのですが、このアップデートが出るのを待っていました。

チャート(CStandartChart)のあるウィンドウがあり、サブグラフの上にウィンドウがある場合、サーバーとの接続が失われ、その後回復した場合、オブジェクト・グラフが他のウィンドウより高くなる。

最上部のウィンドウを何らかの方法で再描画する必要がある。CProgramでこれを追跡することができるのは明らかですが、ライブラリーがそのようなことをするべきだと思います。

(速度がかなり落ちるが、リアルタイム記録のためだろう)


 
Artyom Trishkin:

...

チャート(CStandartChart)が描かれたウィンドウがあり、サブグラフの一番上にウィンドウがある場合、サーバーとの接続が切れて復旧すると、チャート・オブジェクトが他のウィンドウより上位になる。

一番上のウィンドウを何らかの方法で再描画する必要がある。CProgramでこれを追跡することができるのは明らかですが、そのようなことはライブラリーが行うべきだと思います。

(速度がかなり落ちますが、それはリアルタイム記録のためでしょう)。

メッセージありがとう。まだ切断/再接続のテストはしていない。何ができるかやってみるよ。

なぜブレーキが悪いのですか?録画に使っている番組は何ですか?とても遅いですね。プロセッサーに100%の負荷がかかっているように見えるが?Fast Stone Captureで 録画し、MQLアプリケーションのGUIを 積極的に使ってみました。すべて正常で、このように遅くなることはありません。

 
Anatoli Kazharski:

メッセージをありがとう。まだ切断/再接続のテストはしていない。できることをやってみるよ。

スローダウンの原因は何ですか?どの番組で録画しているのですか?とても遅いですね。プロセッサーに100%負荷がかかっているように見えますが?Fast Stone Captureで 録画し、MQLアプリケーションのGUIを積極的に使ってみました。すべて順調で、このように遅くなることはありません。

oCamの無料版。しかし、私は、ところで、リアルタイム録画なしでも遅くなります。オブジェクトがたくさんある。そして、タイマーでは、各シンボルのために価格交差レベルのために多くのシンボルをスキャンする必要があります - それぞれ、独自の、そしてシンボルのリストは動的であり、それはまた、変更を監視する必要があります。一つ良いことがあります - アップデート後、私は前回のようにそれをやり直す必要はありませんでした ;))).
 

Artyom Trishkin:
...

ところで、私もリアルタイム録画なしでスローダウンしている。

オブジェクトの数が多い。

そしてタイマーは、シンボルごとに異なるプライス・クロス・レベルを求めて多くのシンボルをスキャンしなければならないし、シンボルのリストは動的で、変化を監視する必要もある。

...
これらのチェックはどのくらいの頻度で行われるのですか?
 
Anatoli Kazharski:
どのような頻度でチェックするのですか?

タイマー

//+------------------------------------------------------------------+
//| タイマー|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//---
   static int count=0;
   if(count<500)
     {
      count+=TIMER_STEP_MSC;
      return;
     }
//--- カウンターをゼロにする
   count=0;
//--- マーケット・ウォッチで変化を捉えよう
   if(IsChangeSymbolListInMW()) {
      UpdateAllDataAndTables();
      }
//--- 新しいバーの出現をキャッチする
   bool need_update=false;
   for(int i=0; i<ArraySize(m_array_new_bar); i++) {
      if(m_array_new_bar[i].isNewBar()>0) {
         string sy=m_array_new_bar[i].GetSymbol();
         ENUM_TIMEFRAMES timeframe=m_array_new_bar[i].GetPeriod();
         Print("新しいバー",sy," on ",GetNameTF(timeframe));
         if(timeframe==PERIOD_D1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_d1); j++) delete m_array_symbols_new_sig_d1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_d1);
            }
         if(timeframe==PERIOD_W1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_w1); j++) delete m_array_symbols_new_sig_w1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_w1);
            }
         if(timeframe==PERIOD_MN1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_mn); j++) delete m_array_symbols_new_sig_mn[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_mn);
            }
         need_update=true;
         }
      }
   if(need_update) {
      UpdateAllDataAndTables();
      }
//--- メインウィンドウの値テキストを変更する
   short row=(short)m_table_base_symbol_list.SelectedItem();
   ChangeTextData(row);

//--- 通知基準D1、W1、MN1を探す
   GetNotify(m_sorted_struct_symbols_d1,m_array_symbols_new_sig_d1,PERIOD_D1);
   GetNotify(m_sorted_struct_symbols_w1,m_array_symbols_new_sig_w1,PERIOD_W1);
   GetNotify(m_sorted_struct_symbols_mn,m_array_symbols_new_sig_mn,PERIOD_MN1);
//--- グラフを再描画する
   m_chart.Redraw();
  }
//+------------------------------------------------------------------+
タイマーのステップ(TIMER_STEP_MSC) 16
 
Artyom Trishkin:

タイマー

...
タイマー・ステップ (TIMER_STEP_MSC) 16

このような条件チェックは、タイマーの中で正確に行う必要があるのでしょうか?

タイマーの中で行うのであれば、なぜそんなに頻繁に行うのですか?

ステップを減らして、条件のグループごとに異なる間隔を設定することができます。そのためにCTimeCounter クラスを追加しました。この使い方を理解するために、もう一度記事を読んでください。セクション:アイテムテストへの応用

 
Anatoli Kazharski:

このような状態をタイマーでチェックする必要があるのか?

タイマーでチェックする場合、なぜそんなに頻繁にするのですか?

ステップを減らして、条件のグループごとに異なる間隔を設定することができます。この目的のためにCTimeCounter クラスを追加しました。この使い方を理解するために、もう一度記事を読んでください。セクション:アイテムテストアプリケーション

はい、すでに考えています。

もちろん、新しいバーのチェックはそれほど頻繁に行う必要はありません。しかし、いくつかのシンボル(それらのリストはそれぞれ動的に変化し、ティックを扱うクラスのインスタンスは動的に追加/削除されます)の価格がレベルを超えているかどうかのチェックは、時間内にクロスの事実を決定することができるのに十分な頻度で行われる必要があります。

異なるイベントに対して異なる間隔を持つことが可能になったという記事を読んで、私はすぐにそのような必要性を思いついた。

 
Artyom Trishkin:

...しかし、いくつかのシンボル(それらのリストはそれぞれ動的に変化し、ティックを扱うクラスのインスタンスは 動的に追加/削除される)のレベルの価格によるクロスのチェックは、時間内にクロスの事実を決定することができるのに十分な頻度で行われるべきである。

したがって、目盛りを扱う場合は、OnTick()の中でこれらのチェックを行うのがよい。なぜタイマーを16ミリ秒ごとに刻む必要があるのですか?
 
Anatoli Kazharski:
従って、ティックを使用する場合は、OnTick()内でこれらのチェックを行う方がよい。なぜタイマーを16ミリ秒ごとに刻む必要があるのですか?
マルチカレンシーだからです。OnTick()って何?
 
Artyom Trishkin:
マルチカレンシーだ。OnTick()って何?

イベントを通してです。しかし、そのような頻度のタイマーを通してではありません。一般的に、ブレーキはあなたの側にあり、ライブラリやビデオ録画の側にはありません。もう質問はない。