mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 21:06:30 +00:00
make thumbnail generating multithread
fix the bug with open video add class distribution chart
This commit is contained in:
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user