Fermer une DLLImport C # / C ++ ou au moins désallouer sa mémoire de tas? [fermé]

Jan 15 2021

J'ai une application C # .NET Framework qui appelle une DLL C ++ non gérée via DLLImport, pour analyser un tas de fichiers fournis par l'utilisateur et effectuer certaines opérations.

Je voudrais avoir une barre de progression sur mon application C #, car cette analyse de fichier pourrait être un long processus. La meilleure façon que j'ai pensé de faire cela est d'analyser quelques fichiers à la fois, puis de revenir au code C # afin que je puisse mettre à jour la barre de progression.

Cependant, cela m'oblige à allouer de la mémoire sur le tas de la DLL C ++ afin de ne pas avoir à passer tous les 10000+ chemins de fichiers comme arguments chaque fois que je dois appeler à nouveau la fonction C ++.

Je ne sais pas si la fermeture de la DLL après avoir terminé mon analyse est possible. Existe-t-il un autre moyen d'accomplir cette tâche sans avoir à conserver tous les chemins en mémoire alloués pendant toute la durée de l'exécution de l'application?

Réponses

3 RomanPolunin Jan 15 2021 at 05:35

Puisque vous avez confirmé que les fichiers sont indépendants, vous devriez essayer de paralléliser l'opération.

Du côté producteur du processus, configurez une liste ou un tableau avec des noms de fichiers. Si la liste devient trop grande (vraiment, VRAIMENT grande donc elle met l'accent sur la RAM disponible), vous voudrez peut-être la remplacer par une combinaison de BlockingCollection et d'une file d'attente, afin que le producteur puisse être limité jusqu'à ce que le nombre d'éléments dans le tube de traitement soit inférieur au seuil. .

De l'autre côté de ce canal, démarrez un worker (en ligne ou en tant que thread de travail séparé) qui lira séquentiellement ou .AsParallel () les éléments de la collection et les transmettra à la bibliothèque non gérée pour traitement.

Puisqu'il s'agit d'une application d'interface utilisateur, je suppose que votre thread de travail devrait être séparé. Sur chaque fichier traité, effectuez un .Invoke () sur le formulaire de l'interface utilisateur pour mettre à jour la barre de progression.