make thumbnail generating multithread

fix the bug with open video
add class distribution chart
This commit is contained in:
Alex Bezdieniezhnykh
2024-09-25 21:46:07 +03:00
parent 742f1ffee9
commit 22d4493d86
11 changed files with 215 additions and 50 deletions
+22 -17
View File
@@ -3,8 +3,10 @@ using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using Azaion.Annotator.DTO;
using Azaion.Annotator.Extensions;
using Microsoft.Extensions.Logging;
using Color = System.Drawing.Color;
using ParallelOptions = Azaion.Annotator.Extensions.ParallelOptions;
using Size = System.Windows.Size;
namespace Azaion.Annotator;
@@ -14,7 +16,7 @@ public delegate void ThumbnailsUpdatedEventHandler(double thumbnailsPercentage);
public class GalleryManager(Config config, ILogger<GalleryManager> logger) : IGalleryManager
{
public event ThumbnailsUpdatedEventHandler ThumbnailsUpdate;
private const int UPDATE_STEP = 20;
private readonly SemaphoreSlim _updateLock = new(1);
public double ThumbnailsPercentage { get; set; }
@@ -53,32 +55,35 @@ public class GalleryManager(Config config, ILogger<GalleryManager> logger) : IGa
.GroupBy(x => x)
.Select(gr => gr.Key)
.ToHashSet();
var thumbnailsCount = thumbnails.Count;
var files = new DirectoryInfo(config.ImagesDirectory).GetFiles();
var imagesCount = files.Length;
for (int i = 0; i < files.Length; i++)
await ParallelExt.ForEachAsync(files, async (file, cancellationToken) =>
{
var img = files[i];
ThumbnailsPercentage = imagesCount == 0 ? 0 : Math.Min(100, i * 100 / (double)imagesCount);
var imgName = Path.GetFileNameWithoutExtension(img.Name);
if (i % UPDATE_STEP == 0)
ThumbnailsUpdate?.Invoke(ThumbnailsPercentage);
var imgName = Path.GetFileNameWithoutExtension(file.Name);
if (thumbnails.Contains(imgName))
continue;
return;
try
{
await CreateThumbnail(img.FullName);
thumbnailsCount++;
await CreateThumbnail(file.FullName, cancellationToken);
}
catch (Exception e)
{
logger.LogError(e, $"Failed to generate thumbnail for {img.Name}! Error: {e.Message}");
logger.LogError(e, $"Failed to generate thumbnail for {file.Name}! Error: {e.Message}");
}
}
await Task.Delay(10000);
}, new ParallelOptions
{
ProgressFn = async num =>
{
Console.WriteLine($"Processed {num} item by Thread {Environment.CurrentManagedThreadId}");
ThumbnailsPercentage = imagesCount == 0 ? 0 : Math.Min(100, num * 100 / (double)imagesCount);
ThumbnailsUpdate?.Invoke(ThumbnailsPercentage);
await Task.CompletedTask;
},
CpuUtilPercent = 100,
ProgressUpdateInterval = 200
});
}
finally
{
@@ -86,7 +91,7 @@ public class GalleryManager(Config config, ILogger<GalleryManager> logger) : IGa
}
}
public async Task CreateThumbnail(string imgPath)
public async Task CreateThumbnail(string imgPath, CancellationToken cancellationToken = default)
{
var bitmap = await GenerateThumbnail(imgPath);
if (bitmap != null)
@@ -178,7 +183,7 @@ public interface IGalleryManager
{
event ThumbnailsUpdatedEventHandler ThumbnailsUpdate;
double ThumbnailsPercentage { get; set; }
Task CreateThumbnail(string imgPath);
Task CreateThumbnail(string imgPath, CancellationToken cancellationToken = default);
Task RefreshThumbnails();
void ClearThumbnails();
}