オブジェクトを動的に生成するには?(いくつかのOOPネタ) - ページ 5

 
Doerk Hilger:

2. Framework from scratch.

Similar here. When I started to go a bit deeper into the standard libraries I found many things, which I did not like. Not only the bad performance of those, but also lack of flexibility and also because of an incomplete architecture. I am missing for example a global CMouse class/object as well as a class between CWnd and CObject, because CWnd objects are childs of the chart as well as lines are, and there is no connection to such and no final implementation of any such objects at all like I described it above. And, there is no master object, which holds all such chart objects which makes it possible to show/hide all of them with one command, destroy them, whatever. CCanvas, same thing, a nice class but where is the implementation with CWnd which allows me to create interactive objects based on bitmaps that inherit from CWnd? And so on. 




グローバルなCMouseの役割は何でしょうか?マウス操作に簡単にアクセスできるスタンドアロンクラスとしてのみ、エンドユーザーの役に立つのでしょうか?フレームワークとの関係はどうなっているのでしょうか?
CWndとCObjectの間のクラスについてですが、なぜそれらが必要なのか、あなたの説明に納得がいきません。CWndオブジェクトは、線と同様、チャートの子オブジェクトです。
また、上に書いたようなオブジェクトの最終的な実装は全くないと言っているのですね?(どこで説明したのでしょうか?)

 

グローバルマウスオブジェクトは、少なくとも私のGUIでは、マウスに関するあらゆる情報(位置、押下位置、位置の価格など)を保存し、そのような情報を扱うすべてのクラスでアクセスできるようにするためのものです。さらに、マウスオブジェクトは、ドラッグなどのマウスの排他的な使用に関する情報を保持します。これにより、何かがドラッグされている間や、クリックされようとしている間などのCPU時間を大幅に節約することができます。

最後になりましたが、これは重要なことです。マウスイベントがないため、標準ライブラリは EAで使用した場合、Strategy Testerでは何も動作しません。もしあなたがストラテジーテスターでマウスサポートを実装したいのであれば、このようなマウスクラスはとてもありがたいものでしょう。

---

CWndとCObjectの間のクラスだけでなく、ピクセルベースのオブジェクトとタイム/プライスベースのオブジェクトを保持するマスターオブジェクト/コンテナも不足しています。あなたのおっしゃるとおり、これらはすべてチャートのオブジェクトですから、論理的なマスターは、チャートを表し、すべてのオブジェクトを保持するオブジェクトであるべきです。そして、それを実現するためには、CWndとCObjectの間にクラスが存在しなければなりません。

この発想の背景には、ロジックだけでなく、パフォーマンスの問題があります。私の場合、チャートが何らかの形で変化すると、マスター・オブジェクトはそれを検知し、含まれるすべてのオブジェクト(線のコンテナ、CWndのコンテナ、およびこれらのタイプの単一オブジェクト)をループし、その情報を受けたいオブジェクトに「通知」します。つまり、コード内のちょうど1カ所に1つのループがあるだけで、コンテナとサブコンテナの使用により、これは非常に効率的です。

また、このマスターを利用して、すべてのオブジェクトを一度にフリーズさせ、物理的な更新を行わないようにすることも、たった1行のコードで行っています。性能の差は歴然としています。例を挙げます。例:EAに必要なビジュアルオブジェクトをすべて作成する場合、場合によっては1000個以上になりますが、このマスターオブジェクトを前もってフリーズし、他のオブジェクトを作成してから「解凍」すると、チャートの物理更新は1回で済みます。凍結しない場合、このプロセスには丸1分かかることがあります。凍結させれば、2秒もかかりません。

自分でGUIを作り始める前は、標準のライブラリで試していました。その後、部分的にでも残そうとしたんです。しかし、問題は、不完全な実装とアーキテクチャのために、私が考えていたことを実現することが不可能だったということです...LetsMakeSomethingThatWorksSomehowForWeDontKnow "です。視覚的なパフォーマンスは明確な階層構造で達成されていますが、標準のライブラリはどこか無秩序です。

とにかく、このことを認識したのは私が初めてではありません。そして、Alainがすでに述べたように、これが本当に役に立つのかどうか、あまりに理論的なのでよくわかりません。私はただ、MQLに限らず、このようなものについての自分の経験を話すことができるだけです。

 
まず、理論的すぎるというのは同意できない。とても洞察に富んだ内容だと思います。フレームワークの構築に興味がなく、ただインターフェイスパネルを構築するためにフレームワークを使用する必要がある人にとっては、理論的であることは同意できます。

しかし、2番目のタイプの人にとっては、ここで議論されている考え方や考察は非常に貴重であり、非常に実用的でもあります。もちろん、記事のほうがいいのですが、それにしても。
このスレッドだけを読んでフレームワークを作るようになるとは思いませんが、それでも、すでに公開されているMQLフレームワークを作った人たちにとっても不足していると思われる、良い情報と洞察があります。

つまり、マウスとテスターについては、もし私があなたの言うことが正しければ、ユーザー入力の代わりにマウスを呼び出すために ::OnTester() を使用するのですね。

Doerkさん、ありがとうございました。
 
Doerk Hilger:

グローバルマウスオブジェクトは、少なくとも私のGUIでは、マウスに関するあらゆる情報(位置、押下位置、位置の価格など)を保存し、そのような情報を扱うすべてのクラスでアクセスできるようにするためのものです。さらに、マウスオブジェクトは、ドラッグなどのマウスの排他的な使用に関する情報を保持します。これにより、何かがドラッグされている間や、クリックされようとしている間などのCPU時間を大幅に節約することができます。

最後になりましたが、これは重要なことです。マウスイベントがないため、標準ライブラリは EAで使用した場合、Strategy Testerでは何も動作しません。もしあなたがストラテジーテスターでマウスサポートを実装したいのであれば、このようなマウスクラスはとてもありがたいものでしょう。

グローバルマウスがオブジェクトのクリックに気づいたとします。あなたの説明では、オブジェクト自身がマウスクラスの情報を見なければなりません。もしそうだとしたら、CPU時間はどこで節約できるのでしょうか?もしそうでないなら、オブジェクトがマウスイベントを見逃すことはないのでしょうか。例えば、私はボタンをクリックし、次にコンボボックスをクリックしましたが、私のマウスはボタンがクリックされたことを通知せず、現在マウスは最後にクリックしたオブジェクトをコンボボックスとして持っています。ということは、マウスはオブジェクトがクリックされたイベントを通過しているのでしょう。つまり、オブジェクトがクリックされたイベントは、MT5からコントロールクラスに直接来るのではなく、マウスにきて、それからコントロールに転送されるのですが、どこでCPUを節約しているのでしょうか?

それとも、私は何かを見逃しているのでしょうか?
 

マウスオブジェクトは、オブジェクトの上にあるかどうか、オブジェクトによって現在使用されているかどうかを自分で見ることはありません。しかし、マウスオブジェクトは、そのような情報を格納するための中心的な「場所」です。

標準的なコントロールクラスは、すべてのマウスの動きで、すべてのオブジェクトがループされ、この動きがそれらに関係しているかどうかを把握するように動作します。これは、タスクマネージャを起動し、EAまたはIndicatorがロードされてCDialogオブジェクトがその一部であるときにマウスを動かせば簡単にわかるように、多くのCPU時間を必要とします。ダイアログが複雑であればあるほど、CPU使用率は高くなります。

私のGUIでは、グローバルマウスオブジェクトが存在するため、これは異なる方法で行われます。10000個のオブジェクトがあっても、マウスを動かしてもCPU使用率は全く上がりません。特定のオブジェクトの上でマウスボタンが押されるとすぐに、この特定のオブジェクトがマウスオブジェクトにフォーカスがあることを知らせ、このボタンダウンイベントの後でマウスが動くとすぐに、他のオブジェクトはそれを処理する必要がなく、マウスのさらなる動きやマウスムーブイベントは、そのポインタを使って、常にフォーカスを持つオブジェクトに直接ルーティングされるようにできているのです。

そして、すべてのチャート・オブジェクトは、時間/価格ベース(トレンドラインなど)であろうとピクセル座標ベース(パネルなど)であろうと、共通のベースクラスを持っているという事情から、これらのオブジェクトはすべて、これを処理するための共通のオーバーロード関数のセットを使用することができるのです。CWndとCObjectの間に欠けているクラスがあると言ったのもこのためで、このベースクラスは時間/価格ベースのオブジェクトにも使用される同じベースクラスであり、これによって効果的に通信し、このようなイベントを効果的に処理することが可能になるのです。

 
つまり、マウスの動きを聞くのは諦めて、(オブジェクトがクリックされる直前でなければ)マウスのクリックとマウスドラッグにだけ注意を払えばいいということです。マウスクリックに関しては、標準の lib と同じように行われます。オブジェクト自身がクリックを検出し、ドラッグの準備をしたいので、マウスに通知します。もし、マウスがドラッグせずにボタンを離したら、オブジェクトポインタを削除してクリックされたオブジェクトへのフォーカスを止めるだけです。つまり、オブジェクトはクリックを聞き、マウスはドラッグを聞くのです。
つまり、マウスの動きは、オブジェクトがクリックされる直前でなければ、重要で ないとして無視されるということですね。
 

はい。

それでも私は、クリックされたかどうか、どんな動きでもキャッチするオプションを持っていますし、より良いCPUパフォーマンスで、オブジェクト 名を使用 せずに、しかしそれはここでの質問ではありませんでした。

 
そうですね、あなたが伝えようとした絵が見えてきました。確かに、オブジェクトをループさせることなく、マウスの動きもマウス自身に聞かせる方法がありますね。また、オブジェクトにフォーカスが当たったときに、そのポインタを リスナーとして登録するだけで、オブジェクトに通知することもできます。
理由: