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

 
Roman :

나는 프로그래머가 되기 위해 공부한 것이 아니라 모든 것을 스스로 공부하므로 지루하게 차지 마십시오))

저도요. 나는 다른 직업을 가지고 있다. 프로그래밍은 망치와 같은 도구일 뿐입니다.)

MKL용 DLL 생성 - 특별한 기능이 없는 절대 표준 DLL이 있습니다. 나머지는 순수 C++이거나 원하는 경우 순수 C#입니다.

C ++ 또는 Sharpe를 가르치는 것은 내 능력이 아니지만 모든 수준의 수많은 문헌이 있습니다.

MKL에 간단한 DLL 생성에 대한 기사가 있는데, 그 정보에 대해서는 아무 말도 할 수 없습니다. 예, Google은 요청 시 도움을 제공합니다. - C ++ DLL 생성.

그건 그렇고 진입점 등에 대해서. DLL 프로젝트는 Visual Studio 에서 생성되고 필요한 모든 것은 DLL 자체에서 생성되므로 손으로 만지지 마십시오.) 음, 상호 작용 기능, 스레드 등 당신은 당신 자신입니다. 이것은 DLL과 관련된 기능이 없는 C ++입니다.

위협 무언가를 배우는 가장 좋은 방법은 특정 문제를 해결하는 것입니다. 제 생각도 아닙니다.)

 
Yuriy Asaulenko :

저도요. 나는 다른 직업을 가지고 있다. 프로그래밍은 망치와 같은 도구일 뿐입니다.)

MKL용 DLL 생성 - 특별한 기능이 없는 절대 표준 DLL이 있습니다. 나머지는 순수 C++ 또는 원하는 경우 순수 C#입니다.

C ++ 또는 Sharpe를 가르치는 것은 내 능력이 아니지만 모든 수준의 수많은 문헌이 있습니다.

MKL에 간단한 DLL 생성에 대한 기사가 있는데, 그 정보에 대해서는 아무 말도 할 수 없습니다. 예, 요청 시 Google에서 지원 - C++ DLL 생성.

그건 그렇고 진입점 등에 대해서. Visual Studio에서 DLL 프로젝트가 생성되고 필요한 모든 것은 DLL 자체에서 생성되므로 손으로 만지지 마십시오.) 음, 상호 작용 기능, 스레드 등 . 당신 자신입니다. 이것은 DLL과 관련된 기능이 없는 C ++입니다.

예, 빈 진입점으로 dll 자체를 작성할 수 있습니다.)
그러나 진입점에 대한 정보는 어디에도 없으며 단지 주석일 뿐이며 Google도 제공하지 않으며 유사한 문헌((
진입점에 정확히 문제가 있습니다. 상호 작용 기능, 초기화, 메모리 할당 , 스레드, 초기화 해제 등을 어떻게 작성합니까?
나는 스위치의 이 모든 것이 진입점에서 구현되고 그것이 막다른 골목이라는 것을 알고 있습니다))
그리고 무엇을 공부해야 할지조차 모르겠습니다.

 
Roman :

예, 빈 진입점으로 dll 자체를 작성할 수 있습니다.)
그러나 진입점에 대한 정보는 어디에도 없으며 단지 주석일 뿐이며 Google도 제공하지 않으며 유사한 문헌((
진입점에 정확히 문제가 있습니다. 상호 작용 기능, 초기화, 메모리 할당 , 스레드, 초기화 해제 등을 어떻게 작성합니까?
나는 스위치의 이 모든 것이 진입점에서 구현되고 그것이 막다른 골목이라는 것을 알고 있습니다))
그리고 무엇을 공부해야 할지조차 모르겠습니다.

내가 진입점에 대해 아는 것이 있다는 말입니까? 이것은 왕의 문제가 아닙니다.) DLL에는 이것을 결정하는 단 하나의 고유한 기능이 있습니다.

 // 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에는 이것을 결정하는 단 하나의 고유한 기능이 있습니다.

이것을 이해할 필요는 없습니다.) 앞으로는 대부분의 경우 DLL을 작성하고 운용할 때 이것을 사용할 필요가 없습니다. 가장 중요한 것은 손으로 만지지 않는 것입니다.)

아니 그냥 이해만 하시면 되고 동작 순서를 직접 쓰셨으니 잘 아실 거라 생각합니다.
이 진입점에서 함수 초기화, 메모리 할당 , 스레드 생성, 초기화 해제 등의 모든 작업이 수행됩니다.
적어도 이 주제에 대해 무엇을 읽어야 할까요?

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

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

유리 아사울렌코 , 2019.07.27 21:25

DLL에 스레드를 만들고 데이터를 전달하고 스레드를 분리하고 잊어버리면 저절로 작업이 완료됩니다.
DLL의 스레드가 분리되면 터미널 스레드가 해제됩니다. 전체 프로세스는 밀리초 미만이 소요됩니다.
쓰레드 연결을 끊지 않아도 데이터베이스에 쓰는 과정이 4~5ms라는 사실로 판단한다. 글쎄, 60 ticks/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 :

따라서 진입점과 퇴장점을 샤먼화해야 합니다.

...즉, 차트에서 Expert Advisor를 제거하면 터미널이 충돌합니다.

필요하지 않습니다. 진입점의 잘못이 아닙니다. 당신은 뭔가 잘못하고 있습니다.

클래스, 스레드 등 - 이 모든 것이 샤머니즘 없이 완벽하게 생성되고 DLL에서 작동합니다. 그러나 종료할 때까지 DLL의 모든 프로세스가 완료되고 개체가 파괴되어야 합니다. 이것은 DLL을 디버깅할 때 발생합니다.) C/C++에서 모든 제어는 프로그램이 아니라 프로그래머의 책임입니다.

ZY 저는 이렇게 합니다. 나는 응용 프로그램에서 DLL 함수를 호출합니다.

 bool job = true ;

void Close() 
{
	job = false ;
	delete Obj1;
	delete Obj2;
	......
}
job=false이면 모든 프로세스가 종료되고, 삭제하면 cat에 할당된 모든 객체가 삭제되는 식입니다.
 
Yuriy Asaulenko :

그러나 종료할 때까지 DLL의 모든 프로세스가 완료되어야 합니다.

이게 문제일 가능성이 높네요. 저도 몰랐는데, 연결을 끊을 때 dll 자체가 프로세스를 종료시키는 줄 알았습니다.
종료하기 전에 모든 프로세스를 종료하는 방법에 대해 생각해 보겠습니다. 팁 감사합니다.
그러나 DLL_PROCESS_DETACH만이 이에 대한 책임이 있으며 이 경우 모든 프로세스를 강제로 충돌시켜야 합니다.

 
Roman :

그러나 DLL_PROCESS_DETACH만이 이에 대한 책임이 있으며 이 경우 모든 프로세스를 강제로 충돌시켜야 합니다.

그녀는 응용 프로그램에서 DLL 연결을 끊을 책임이 있습니다. DllMain()의 책임은 표준 통신 프로토콜을 지원하는 것입니다. DLL_PROCESS_DETACH는 완전히 다른 것에 관한 것입니다.) 그녀는 어떤 식으로든 귀하의 프로세스에 관심이 없습니다. 이것은 전적으로 귀하의 비즈니스입니다.

MT에는 종료 기능이 있습니다. onClose() 인 것 같습니다. 여기에 모든 프로세스가 있으며 적절한 DLL 함수를 호출하여 완료합니다.

 
Yuriy Asaulenko :

그녀는 응용 프로그램에서 DLL 연결을 끊을 책임이 있습니다. 귀하의 프로세스는 그녀에게 관심이 없습니다. 이것은 전적으로 귀하의 비즈니스입니다.

알겠습니다. 시간을 내어 미묘한 부분을 설명해주셔서 감사합니다. 감사합니다.