MQLによる非同期・マルチスレッドプログラミング - ページ 24

 
Roman:

プログラマーになるために勉強したわけではなく、すべて自分で勉強しているので、蹴飛ばさないでください ))

私もそうです。私は別の職業を持っています。プログラミングはハンマーのような道具に過ぎない)。

MKL用のDLLを作成 - 全く標準的なDLLで、特別な機能はありません。あとは純粋なC++、あるいは好きなように純粋なC#です。

C++やSharpを教えるのは私には無理ですが、どんなレベルでも文学のワゴンはありますよ。

MKLに簡単なDLLの作成についての記事がありますが、参考になるかどうかは何とも言えません。はい、そしてクエリに役立つGoogle - C++のDLL作成。

ちなみに、エントリーポイントなどといえば。Visual Studioでは DLLプロジェクトが作成され、必要なものはすべて勝手に作成されます、ただ、手で触らないように)。まあ、対話機能、スレッドなどはお好みでどうぞですが。- は、あなた次第です。これはC++で、DLLに特化した機能はありません。

SZY 何かを学ぶには、自分が具体的な課題を解決するのが一番です。私が発明したわけでもないのですが)。

 
Yuriy Asaulenko:

私もそうです。私は別の職業を持っています。プログラミングはハンマーのような道具に過ぎない)。

MKL用のDLLの作成 - そこでは全く標準的なDLLで、特別な機能はない。あとは純粋なC++、あるいは好きなように純粋なC#です。

C++やSharpを教えるのは私には無理ですが、どんなレベルでも文学のワゴンはありますよ。

MKLに簡単なDLLの作成についての記事がありますが、参考になるかどうかは何とも言えません。はい、そしてクエリに役立つGoogle - C++のDLL作成。

ちなみに、エントリーポイントなどといえば。Visual StudioではDLLプロジェクトが作成され、必要なものはすべて勝手に作成されます、ただ、手で触らないように)。そして、インタラクション機能、スレッドなどは、あなた次第です。- は、あなた次第です。これはC++であり、DLLに特化した機能はありません。

はい、エントリーポイントを空にして、DLL自体を書くことができます))
しかし、エントリーポイントの情報はどこにもなく、ただすずしいだけで、googleが与えるものもなく、文献も似ていない((。
相互作用関数、初期化、メモリ割り当て、スレッド、非初期化などを書かれているように、まさにエントリポイントに問題がありますね。
すべてエントリポイントのスイッチで実装して、それでデッドロックというのは知っています))。
何を基準に勉強すればいいのかもわからない。

 
Roman:

はい、私は空のエントリポイントで、DLL自体を書くことができます))
しかし、エントリーポイントの情報はどこにもなく、googleも類似の文献もない、まさに地獄((
相互作用関数、初期化、メモリ割り当て、スレッド、非初期化などを書かれているように、まさにエントリポイントに問題がありますね。
すべてエントリポイントのスイッチで実装して、それでデッドロックというのは知っています))。
何を基準に勉強すればいいのかもわからない。

エントリーポイントについて、私が何か知っているとでも?王様には関係ないことです)。DLLには、それを定義するユニークな関数が1つだけ存在します。

// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}

理解する必要はない)。今後、DLLを記述して運用する場合、ほとんどの場合、これを使用する必要はありません。手で触れないことが最大のポイントです)。

 
Yuriy Asaulenko:

エントリーポイントについて、私が何か知っているとでも思っているのでしょうか?王様には関係ないことです)。DLLには、それを定義するユニークな関数が1つだけ存在します。

理解する必要はない)。今後、DLLを記述して運用する場合、ほとんどの場合、これを使用する必要はありません。手で触れないことが最大のポイントです)。

いや、理解する必要があるのは、自分で一連の動作を書いているのだから、よく分かっているのでは?
この入力ポイントでは、すべてのアクション、関数の初期化、メモリ割り当て、スレッドの作成、初期化などが実行されます。
少なくともこのテーマで何を読めばいいのか?

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

MQLによる非同期・マルチスレッドプログラミング

ユリイ・アサウレンコ さん 2019.07.27 21:25

DLLでスレッドを作成し、データを渡し、スレッドを切断して忘れる - タスクが終了したら勝手に終了する。
DLLでスレッドを切断すると、端末のスレッドは解放されます。すべての処理にかかる時間は、1ミリ秒以下だと思います。
スレッドを切断しなくても、データベースへの書き込み処理が4〜5msであることから判断して。まあ、60ticks/sもあれば、ターミナルからの非同期呼び出しで悲しむことはないでしょう。


 
Roman:

いや、理解する必要があるのは、自分でシーケンスを書いているのだから、よく分かっているだろうと思った。
せめて何を読めばいいのか?

理解したり、修正したりする必要はありません。VSでDLLプロジェクトを作成 すると、DllMain()が勝手に作成されます。すべてのWindowsアプリケーションで自動的にサポートされます。

あなたの仕事は、エクスポート関数と、それ以外に必要なC++のコードを書くことです。DLLの準備が整い、動作するようになりました。

OOPは、オブジェクトの内部構造を全く知らないで適用することを主眼に設計されているので、何でもかんでも覚えるのではなく、自分の課題を正確に解決することに集中できるのです。私たちは自動車を運転していますが、その電子機器やエンジンの構造については全く知らないかもしれません。それは、DLLの場合も同じです。

そして、先に引用したDllMain()関数は、かなり複雑なDLLの実際のプロジェクトからの引用で、そのタスクを実行するものです。

 
Yuriy Asaulenko:

理解したり、修正したりする必要はありません。VSでDLLプロジェクトを作成すると、DllMain()が勝手に作成されます。すべてのWindowsアプリケーションで自動的にサポートされます。

あなたの仕事は、エクスポート関数と、それ以外に必要なC++のコードを書くことです。DLLの準備が整い、動作するようになりました。

OOPは、オブジェクトの内部構造を全く考えずに適用することを主目的として設計されています。私たちは車に乗っていますが、その電子機器やエンジンの構造については全く知らないかもしれません。DLLの場合も同じです。

これは理解できる。機能そのものは問題ない。第1条と第2条のようなすべての規約があれば、これには何の問題もない。
しかし、私が想定しているように、呼び出された 関数のためのスレッドを作成するために。
DLL_THREAD_ATTACH の場合、C++ を少しいじくる必要があります。
メモリを確保し、関数用のスレッドを作成します。
を実行し、DLL_THREAD_DETACHですべて片付けるので、見た目ほど簡単ではありません。

というのも、ある非同期ライブラリを試したところ、タスクが非同期に実行されるのです。
このライブラリからDLLを作りたかったのですが、なぜかプログラムの最後、つまりチャートからExpert Advisorを削除するところで必ずクラッシュしてしまいます。
このため、入口と出口をいじる必要がある。

 
Roman:

そのため、入口と出口をいじる必要があるのです。

...つまり、チャートからEAを削除すると、私のターミナルはクラッシュします。

その必要はありません。悪いのはエントリーポイントではありません。やり方が悪いんだ。

クラス、スレッド、などなど。- は、すべて完璧に作成され、シャーマニズムなしでDLLで正常に動作しています。しかし、あなたが終了するまでに、DLL に含まれるすべての YOUR プロセスを終了させ、オブジェクトを破棄しなければなりません。DLLをデバッグするとこのような現象が発生します)。C/C++では、すべての制御はプログラムではなく、プログラマの仕事です。

ZS 私はこうしています。アプリケーションからDLL関数を呼び出すと、例えば

bool job =true;

void Close() 
{
	 job = false;
	 delete Obj1;
	 delete Obj2;
	......
}
job=falseでは全てのプロセスが終了し、deleteではメモリが確保された全てのオブジェクトが削除されるなど。
 
Yuriy Asaulenko:

しかし、あなたが帰るまでに、DLL内のあなたのプロセスはすべて終了していなければなりません。

それが問題なんでしょうね、知らなかったです、DLLはアタッチ解除時に自分の処理を完了させると思ってました。
終了前に全プロセスを終了させる方法、考えてみます、ありがとうございます。
しかし、ちょうどDLL_PROCESS_DETACHがそれを担っており、この場合、すべてのプロセスを強制的に終了する必要が あります。

 
Roman:

しかし、これはまさにDLL_PROCESS_DETACHが担っていることであり、この場合、すべてのプロセスを強制的に終了させなければ ならないのです。

DLLとアプリケーションの接続を解除する役割を担っています。DllMain() は標準的な通信プロトコルを維持する責任があります。DLL_PROCESS_DETACH はそれ以外のことです。) あなたのプロセスは興味がなく、もっぱらあなたのビジネスです。

MTには、シャットダウン機能があります。OnClose()だと思うのですが。ここでは、そこから、すべてのプロセスと適切な関数DLLを呼び出すことによって終了します。

 
Yuriy Asaulenko:

アプリケーションからDLLを切り離す役割を担っています。あなたのプロセスには興味がなく、すべてあなた次第です。

OK、試してみます。細かい点まで丁寧に説明していただき、ありがとうございました。