Bir C # / C ++ DLLImport kapatılsın mı yoksa en azından yığın belleğini serbest bırakmak mı? [kapalı]

Jan 15 2021

DLLImportKullanıcı tarafından verilen bir grup dosyayı ayrıştırmak ve bazı işlemleri gerçekleştirmek için yönetilmeyen bir C ++ DLL'yi çağıran bir C # .NET Framework uygulamam var .

Bu dosya ayrıştırma uzun bir süreç olabileceğinden, C # uygulamamda bir ilerleme çubuğunun olmasını istiyorum. Bunu yapmayı düşündüğüm en iyi yol, bir seferde birkaç dosyayı ayrıştırmak ve ardından ilerleme çubuğunu güncelleyebilmem için C # koduna geri dönmek.

Bununla birlikte, bu, C ++ DLL'nin yığınına biraz bellek ayırmamı gerektiriyor, böylece C ++ işlevini her tekrar çağırmam gerektiğinde 10.000'den fazla dosya yolunu bağımsız değişken olarak geçirmek zorunda kalmıyorum.

Ayrıştırmamı tamamladıktan sonra DLL'yi kapatmanın mümkün olup olmadığından emin değilim. Bu görevi, uygulamanın çalıştığı sürenin tamamı boyunca ayrılmış bellekte tutmak zorunda kalmadan gerçekleştirebilmemin başka bir yolu var mı?

Yanıtlar

3 RomanPolunin Jan 15 2021 at 05:35

Dosyaların bağımsız olduğunu onayladığınız için, işlemi paralelleştirmeyi denemelisiniz.

Sürecin üretici tarafında, bir Liste veya dosya adlarıyla bir dizi oluşturun. Liste çok büyürse (gerçekten, GERÇEKTEN büyük olduğundan kullanılabilir RAM'i vurgular), onu bir BlockingCollection ve bir Queue kombinasyonuyla değiştirmek isteyebilirsiniz, böylece üretici, işleme borusundaki öğe sayısı eşiğin altına düşene kadar kısıtlanabilir. .

Bu borunun diğer tarafında, koleksiyondaki öğeleri sıralı olarak veya .AsParallel () okuyacak ve bunları işlenmek üzere yönetilmeyen kitaplığa aktaracak bir işçi (satır içi veya ayrı çalışan iş parçacığı olarak) başlatın.

Bu bir UI uygulaması olduğundan, çalışan iş parçacığınızın ayrı olması gerektiğini tahmin ediyorum. Her işlenen dosyanın üzerine, ilerleme çubuğunu güncellemek için UI formunda bir .Invoke () yapın.