C # / C ++ DLLImport를 닫거나 적어도 힙 메모리 할당을 취소 하시겠습니까? [닫은]

Jan 15 2021

DLLImport사용자가 제공 한 파일을 구문 분석하고 일부 작업을 수행하기 위해 를 통해 관리되지 않는 C ++ DLL을 호출하는 C # .NET Framework 응용 프로그램이 있습니다.

이 파일 구문 분석이 긴 프로세스 일 수 있으므로 내 C # 응용 프로그램에 진행률 표시 줄을 표시하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 한 번에 두 개의 파일을 구문 분석 한 다음 C # 코드로 돌아가서 진행률 표시 줄을 업데이트하는 것입니다.

그러나 이렇게하려면 C ++ DLL의 힙에 일부 메모리를 할당해야하므로 C ++ 함수를 다시 호출해야 할 때마다 10,000 개 이상의 파일 경로를 인수로 모두 전달할 필요가 없습니다.

구문 분석을 완료 한 후 DLL을 닫을 수 있는지 확실하지 않습니다. 응용 프로그램이 실행되는 전체 시간 동안 할당 된 메모리의 모든 경로를 유지하지 않고도이 작업을 수행 할 수있는 다른 방법이 있습니까?

답변

3 RomanPolunin Jan 15 2021 at 05:35

파일이 독립적임을 확인 했으므로 작업을 병렬화해야합니다.

프로세스의 생산자 측에서 파일 이름이있는 목록 또는 배열을 설정합니다. 목록이 너무 커지면 (정말로 사용 가능한 RAM에 스트레스를 주므로) BlockingCollection과 대기열의 조합으로 대체 할 수 있으므로 처리 파이프의 항목 수가 임계 값 미만이 될 때까지 생산자가 제한 될 수 있습니다. .

이 파이프의 다른 쪽에서 순차적으로 또는 .AsParallel ()이 컬렉션에서 항목을 읽고 처리를 위해 관리되지 않는 라이브러리로 전달하는 작업자 (인라인 또는 별도의 작업자 스레드)를 시작합니다.

이것은 UI 애플리케이션이기 때문에 작업자 스레드가 분리되어야한다고 생각합니다. 처리 된 각 파일에서 UI 양식에서 .Invoke ()를 수행하여 진행률 표시 줄을 업데이트합니다.