MQL의 비동기 및 다중 스레드 프로그래밍 - 페이지 2

 
Koldun Zloy :

MT 개발 회사의 담당자가 이미 답변한 내용을 번역하고 있습니다.

MQL에서 흐름을 생성할 수 없습니다. WinAPI를 사용하더라도.

자신의 DLL을 작성해야만 이 작업을 수행할 수 있습니다.

WinAPI 및 표준 dll을 사용합니다!

kernel32.dll
user32.dll

등.

mql 함수가 아닌 WinAPI 함수를 사용한 다중 스레드 작업이 가정되었습니다.
그러나 다중 스레드된 mql 기능으로 작업하는 것이 불가능하다는 사실은 그렇습니다.

 
Roman :

WinAPI 및 표준 dll을 사용합니다!

kernel32.dll _
user32.dll

흠, 제 생각에는 정확히 반대입니다. WinAPI는 동적 라이브러리인 kernel32.dll , user32.dll...

제 생각에는 "Hello Word!"라는 텍스트가 있는 일반 Windows 창에서 순수한 C++로 작성하려고 시도한 적이 없습니다. - "car with trolley" 네트워크의 예에서 첫 번째 "Hello Word!"를 작성하십시오. - 많은 것이 저절로 해결될 것입니다 ;)

 
Igor Makanu :

흠, 제 생각에는 정확히 반대입니다. WinAPI는 동적 라이브러리인 kernel32.dll , user32.dll...

제 생각에는 "Hello Word!"라는 텍스트가 있는 일반 Windows 창에서 순수한 C++로 작성하려고 시도한 적이 없습니다. - "car with trolley" 네트워크의 예에서 첫 번째 "Hello Word!"를 작성하십시오. - 많은 것이 저절로 해결될 것입니다 ;)


표준은 이것이 표준 Windows dll임을 의미하며 표준은 정적 .lib임을 의미하지 않습니다.

이고르, 당신은 잘못된 대초원에 있습니다 ...
그리고 여기 "Hello Word!" 질문이 dll을 초기화하고 자체 스레드에서 함수를 호출하는 것에 관한 것일 때!

예를 들어:
WinAPI 함수 MessageBoxW()가 있습니다.
스레드에서 호출해야 합니다.

이를 위해서는 dll 자체와 내보낸 함수 를 초기화해야 하며, 이를 올바르게 수행하는 방법에 대한 예를 들어야 합니다.

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

그런 다음 초기화 후 MessageBoxW()를 호출합니다. CreateThread() 사용;
함수를 실행한 후 리소스를 해제하고 스트림을 닫습니다.
mql에서 올바르게 수행하는 방법에 대한 예를 제시하시겠습니까?

 
지금은 다중 스레드 시스템에서 작업하고 있습니다. 그러나 MKL이 아니라 표준 C++에서. 오, 거기에 얼마나 많은 갈퀴가 흩어져 있습니까?))
 
Roman :


표준은 이것이 표준 Windows dll임을 의미하며 표준은 정적 .lib임을 의미하지 않습니다.

이고르, 당신은 잘못된 대초원에 있습니다 ...
그리고 여기 "Hello Word!" 질문이 dll을 초기화하고 자체 스레드에서 함수를 호출하는 것에 관한 것일 때!

예를 들어:
WinAPI 함수 MessageBoxW()가 있습니다.
스레드에서 호출해야 합니다.

이를 위해서는 dll 자체와 내보낸 함수 를 초기화해야 하며, 이를 올바르게 수행하는 방법에 대한 예를 들어야 합니다.

그런 다음 초기화 후에 MessageBoxW()를 호출합니다. CreateThread() 사용;
함수를 실행한 후 리소스를 해제하고 스트림을 닫습니다.
mql에서 올바르게 수행하는 방법에 대한 예를 제시하시겠습니까?

이것은 잘못된 대초원에있는 당신입니다, 당신은 대답했습니다 - dll을 작성하십시오 (메모리를 할당하고 새 스레드를 등록해야합니다! - 종료 할 때 모든 것을 깨끗하게 파괴하십시오!). MQL에서 호출

예제 메모리 할당 및 프로세스 등록의 위치는 어디입니까? MessageBox를 호출했다는 사실 - 그것은 MQL 프로그램이 리소스를 제공했지만 별도의 스레드를 생성하지 않았다는 것을 의미합니다. 확인하고 싶지도 않지만 MessageBox를 호출하면 터미널이 정지해야합니다

 
Igor Makanu :

당신은 잘못된 대초원에 있습니다, 당신은 대답했습니다 - dll을 작성하고 MQL에서 호출하십시오

예제 메모리 할당 및 프로세스 등록의 위치는 어디입니까? MessageBox를 호출했다는 사실 - 그것은 MQL 프로그램이 리소스를 제공했지만 별도의 스레드를 생성하지 않았다는 것을 의미합니다. 확인하고 싶지도 않지만 MessageBox를 호출하면 터미널이 정지해야합니다

이고르, dll 초기화 함수를 예로 들어 설명을 이해했지만 mql에서 올바르게 수행하는 방법을 모릅니다. 순수한 C++는 오해의 소지가 있습니다.
예, 그리고 mql 언어의 바로 그 기능이 두뇌를 가루로 만들 수 있습니다. 그래서 Google이 아닌 포럼에 도움을 요청했습니다.
WinAPI가 이미 dll에 구축되어 있고 호출된 함수가 이미 user32.dll 에 있는 경우 dll을 작성해야 하는 이유
그래서 mql에서 올바르게 수행하는 방법에 대한 이 문제를 이해하기 위해 주제를 만들었습니다. 메모리 할당 및 프로세스 등록 위치를 알려주세요)).
이것이 mql에서 어떻게 수행되는지에 대한 올바른 예를 보여줍니까?
아니면 좋은 가이드를 알려주세요.

 
Roman :

이고르, dll 초기화 함수를 예로 들어 설명을 이해했지만 mql에서 올바르게 수행하는 방법을 모릅니다. 순수한 C++는 오해의 소지가 있습니다.
예, 그리고 mql 언어의 바로 그 기능이 두뇌를 가루로 만들 수 있습니다. 그래서 Google이 아닌 포럼에 도움을 요청했습니다.
WinAPI가 이미 dll에 구축되어 있고 호출된 함수가 이미 user32.dll 에 있는 경우 dll을 작성해야 하는 이유
그래서 mql에서 올바르게 수행하는 방법에 대한 이 문제를 이해하기 위해 주제를 만들었습니다. 메모리 할당 및 프로세스 등록 위치를 알려주세요)).
이것이 mql에서 어떻게 수행되는지에 대한 올바른 예를 보여줍니까?
아니면 좋은 가이드를 알려주세요.

WinAPI를 사용하더라도 mql 프로그램에서 스레드를 생성하지 마십시오.

 
Roman :

이고르, dll 초기화 함수를 예로 들어 설명을 이해했지만 mql에서 올바르게 수행하는 방법을 모릅니다. 순수한 C++는 오해의 소지가 있습니다.
예, 그리고 mql 언어의 바로 그 기능이 두뇌를 가루로 만들 수 있습니다. 그래서 Google이 아닌 포럼에 도움을 요청했습니다.
WinAPI가 이미 dll에 구축되어 있고 호출된 함수가 이미 user32.dll 에 있는 경우 dll을 작성해야 하는 이유
그래서 mql에서 올바르게 수행하는 방법에 대한 이 문제를 이해하기 위해 주제를 만들었습니다. 메모리 할당 및 프로세스 등록 위치를 알려주세요)).
이것이 mql에서 어떻게 수행되는지에 대한 올바른 예를 보여줍니까?
아니면 좋은 가이드를 알려주세요.

다시 한 번 - 이것은 MQL을 통해 수행되는 것이 아니라 다른 쪽에서 - 꼬리 측면에서 문제를 해결합니다. 머리부터!

dll 작성 - MQL에서 호출하고 dll에 데이터 전달, MQL 프로그램(복잡한 계산)을 중지할 필요가 없는 경우 dll에서 새 스레드를 생성하고 이 스레드에서 데이터 처리

dll을 작성하는 방법 - 포럼 검색 "dll" 기사 20은 정확히

가이드는 없지만 dll을 작성할 내용에 대해 - 해당 리소스에 대해 스레드를 생성하는 방법 등에 대한 솔루션을 찾으십시오.

 
Dmitry Fedoseev :

WinAPI를 사용하더라도 mql 프로그램에서 스레드를 생성하지 마십시오.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL의 비동기 및 다중 스레드 프로그래밍

MetaQuotes Software Corp. , 2019.07.24 16:31

MQL 함수 는 DLL에서 호출 할 수 없습니다 .

그러나 DLL 호출을 통해 여러 스레드를 시작 하여 해당 환경에서 MQL5와 독립적으로 작동하도록 할 수 있습니다.

예를 들어, 데이터는 MQL에서 준비되어 어딘가에 배치되거나 DLL 라이브러리로 전송되며, DLL 라이브러리는 차례로 여러 스레드에서 작업을 완료하고 추가 기능을 통해 결과를 반환합니다.


Windows API 함수에 대한 호출은 dll의 호출입니다. 즉, Windows API 함수의 경우 CreateThread()를 사용하여 스레드를 만들 수 있습니다.
당연히
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 참조 - 이것은 스레드에서 작동할 함수에 대한 진입점 주소입니다. 메모리 할당 에 대해 침묵을 유지합니다.

이 문제를 해결하려면 메모리에 MQL을 사용하여 MyFunc()의 주소를 가져오는 방법을 찾아야 합니다. 하지만 메모리에는 없습니다. 단어에서가 아니라... 전혀 아닙니다!


나는 문제를 "손가락으로"더 명확하게 설명하는 방법을 모르겠습니다 ... 실제로 존재하지 않습니다)))