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

 
Koldun Zloy:

すでにMT開発会社の担当者から聞いていることを翻訳します。

MQLからスレッドを作成することはできません。WinAPIでもダメ。

これは、自分でDLLを書くしかないのです。

WinAPIで、標準のDLLを使用 !

kernel32.dll
ユーザー32.dll

など

マルチスレッドはWinAPI関数で行うことを想定しており、mql関数で行うことは想定していません。
しかし、mqlの関数でマルチスレッド作業ができないのは残念です。

 
Roman:

WinAPIで、標準のDLLを使用 !

kernel32.dll
ユーザー32.dll

WinAPIは、kernel32.dll、user32.dllなどのダイナミックライブラリで実装されているのですが・・・。

純粋なC++で、いつものWindowsのウィンドウに "Hello Word!" というテキストを書こうとしたことはないだろう。- ネットに例があるので、最初の「Hello Word!」を書いてみてください。- 勝手に治る)

 
Igor Makanu:

WinAPIは、kernel32.dll、user32.dllなどのダイナミックライブラリとして実装されています。

純粋なC++で、いつものWindowsのウィンドウに "Hello Word!" というテキストを書こうとしたことはないだろう。- ネットに例があるので、最初の「Hello Word!」を書いてみてください。- を使えば自ずと解決する)


標準はWindows標準のDLLを意味し、標準は静的な.libであることを意味しない

イゴール、道を間違えてる...。
Hello Word!" と、DLLの初期化、およびスレッド内でのDLLからの関数呼び出しと、どんな関係があるのでしょうか !

例えば、こんな感じです。
WinAPI関数 MessageBoxW()があります。
独自のスレッドで呼び出す必要があります。

そのためには、DLL自身とエクスポートされた関数を 初期化する必要がありますが、これを正しく行うための例を教えてください。

LoadLibraryW("user32.dll");
GetProccAddress(hMyDll, "MessageBoxW");
FreeLibrary(hMyDll);
и т.д.

そして、初期化後、CreateThread()でMessageBoxW();を呼び出します。
関数実行後、リソースを解放し、スレッドをクローズします。
mqlで正しく行うための例を教えてください。

 
現在、マルチスレッドに取り組んでいます。しかし、MCLではなく、標準のC++で。ああ、熊手ってこんなにあるんだ)
 
Roman:


標準はWindows標準のDLLを意味し、標準は静的な.libを意味するものではありません。

イゴール、方向性が違うぞ...。
Hello Word!" と、DLLの初期化、およびスレッド内でのDLLからの関数呼び出しと、どんな関係があるのでしょうか !

例えば、こんな感じです。
WinAPI関数 MessageBoxW()があります。
独自のスレッドで呼び出す必要があります。

そのためには、DLL自身とエクスポートされた関数を 初期化する必要がありますが、これを正しく行うための例を教えてください。

そして、初期化後、CreateThread()でMessageBoxW();を呼び出します。
関数実行後、リソースを解放し、スレッドをクローズする。
mqlで正しく行うための例を教えてください。

あなたは間違った方向に進んでいる、あなたは言われました - dllを書く(その中で、メモリを割り当て、新しいスレッドを登録する必要があります!)。- そして、終了時に慎重にすべてを破棄してください!)そして、MQLからそれを呼び出します。

MessageBoxの呼び出しは、MQLプログラムがリソースを割り当てたが、別のスレッドを作成していないことを意味します。 確認する気もありませんが、MessageBoxを呼び出すと、ターミナルがフリーズするはずです。

 
Igor Makanu:

だから、DLLを書いて、MQLから呼び出せばいいんだよ。

MessageBoxを呼び出したということは、MQLプログラムがリソースを提供しただけで、別のスレッドを作成したわけではないということです。 確認する気もありませんが、MessageBoxを呼び出すと、ターミナルがフリーズするはずです。

Igor、私は、私が言っていることを理解するために、例として初期化DLL関数を引用しました。 しかし、私は、mqlでそれを正しく行う方法を認識していません、純粋なC++は、誤解を招く可能性があります。
mql自体の特殊性が混乱を招いているのかもしれません。そのため、Googleではなく、フォーラムに助けを求めたのです。
WinAPIはdllで構築され、呼び出し可能な関数は、例えば
、user32.dllにすでにあるとき、なぜ私はdllを書く必要がありますか? 私はmqlでそれを正しく行う方法の質問を理解し、あなたはメモリ割り当てと プロセス登録がどこにあるのか教えてください))、トピックを作成しました。
mqlでどのように行うか、適切な例を示してください。
または、良いガイドを指示してください。

 
Roman:

Igor、私が言いたいことを理解するために、DLLの初期化関数を例に挙げましたが、mqlで正しく行う方法はわかりません、純粋なC++は誤解を招く可能性があります。
mql自体の特殊性が混乱を招いているのかもしれません。そのため、Googleではなく、フォーラムに助けを求めたのです。
WinAPIはdll上で構築され、呼び出し可能な関数は、例えば
、user32.dllにすでにあるとき、なぜ私はdllを書く必要がありますか? 私は質問を理解するためにトピックを作成しました、mqlでそれを正しく行う方法、あなたはメモリ割り当てと プロセス登録がどこにあるかを教えてください)).
mqlでどのように行うか、適切な例を示してください。
または、良いガイドを指示してください。

WinAPIを使用しても、mqlプログラムからスレッドを作成することはできません。

 
Roman:

Igor、私が言いたいことを理解するために、DLLの初期化関数の例を挙げましたが、mqlでそれを正しく行う方法は、私は知りません、純粋なC++は誤解を招く可能性があります。
mql自体の特殊性が混乱を招いているのかもしれません。そのため、Googleではなく、フォーラムに助けを求めたのです。
WinAPIはdll上で構築され、呼び出し可能な関数は、例えば
、user32.dllにすでにあるとき、なぜ私はdllを書く必要がありますか? 私は質問を理解するためにトピックを作成しました、mqlでそれを正しく行う方法、あなたはメモリ割り当てと プロセス登録がどこにあるかを教えてください)).
mqlでどのように行うか、適切な例を示してください。
または、良いガイドを指示してください。

もう一度言いますが、これはMQLではできません。ヘッド側からではなく、テール側から問題を解決するのです

dllを書き、それをMQLから呼び出してデータを渡し、MQLプログラムを続ける必要がある場合(複雑な計算)、dll内に新しいスレッドを作成し、このスレッドでデータを処理します。

dllの書き方については、フォーラムで "dll "と検索すると20件ほど出てきます。

チュートリアルはありませんが、DLLを書くのに使うリソースなので、スレッドの作り方などの解答を探します。

 
Dmitry Fedoseev:

WinAPIを使用しても、mqlプログラムからフローを作成することはできません。

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

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

メタクォーツ・ソフトウェア株式会社, 2019.07.24 16:31

DLLからMQL関数を 呼び出すことはできません

しかし、DLLコールを介して複数のスレッドを実行 し、その環境でMQL5から独立して動作するようにすることは可能です。

例えば、MQLからデータを用意して、どこかに置いたり、DLLに渡したりすると、今度はDLLが複数のスレッドでタスクを実行し、追加の関数で結果を返します。


Windows API関数の呼び出しはdllからの呼び出し なので、CreateThread();使ってWindows API関数用のスレッドを 作成できることになります。
CreateThread();がmql標準ライブラリに移植 されたのは無駄なことではありません。

 
Roman:

Windows API関数の呼び出しはdllからの呼び出しなので、Windows API関数の場合はCreateThread();でスレッドを作成 することが可能です。
CreateThread();は訳あってmql標準ライブラリに移植 されました。

誰も何も移植していません。パッケージに書かれているのは、単なる関数のシグネチャです。

フローを作成するには、関数本体が必要です - これがフローの中で実行される本体です!

Windowsでスレッドを登録するには、構造体を記入する必要があります。

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

lpStartAddressを 参照- これはスレッドで実行される関数のエントリポイントアドレスで、メモリの割り当てについては 心配しないでください。

この問題を解決するには、MyFunc()のアドレスを取得する機会を見つける必要があります - メモリ内で、それは不在です - まあ、どこにもすべての...とんでもない


他にどう説明したらいいのかわからないのですが.というのは、実際には存在しないのですが ))))