Fixing Various Bugs On Delegates

This commit is contained in:
2025-07-11 19:04:37 +02:00
parent 73413e44b4
commit f1f300a351
12 changed files with 2765 additions and 1207 deletions

View File

@ -0,0 +1,171 @@
// ================================================================================================
// DTFluxAsyncParser.h - Async Response Parser
// ================================================================================================
#pragma once
#include "CoreMinimal.h"
#include "HAL/CriticalSection.h"
#include "Async/TaskGraphInterfaces.h"
#include "Struct/DTFluxServerResponseStruct.h"
// Forward declarations
// ================================================================================================
// DELEGATES POUR LE PARSING ASYNCHRONE
// ================================================================================================
DECLARE_DELEGATE_ThreeParams(FOnParsingCompleted, const FGuid& /*RequestId*/,
TSharedPtr<FDTFluxServerResponse> /*ParsedResponse*/, bool /*bSuccess*/);
DECLARE_DELEGATE_TwoParams(FOnParsingFailed, const FGuid& /*RequestId*/, const FString& /*ErrorMessage*/);
// ================================================================================================
// ASYNC PARSER - Délégation du parsing avec TaskGraph
// ================================================================================================
/**
* Gestionnaire centralisé pour le parsing asynchrone des réponses JSON
* Utilise le TaskGraph d'Unreal Engine pour déléguer le parsing sur des worker threads
*/
class DTFLUXNETWORK_API FDTFluxAsyncParser
{
public:
FDTFluxAsyncParser();
~FDTFluxAsyncParser();
// === INTERFACE PUBLIQUE ===
/**
* Lancer le parsing asynchrone d'une réponse JSON
* @param RequestId - ID de la requête pour le suivi
* @param RawJsonData - Données JSON brutes à parser
* @param OnCompleted - Callback appelé en cas de succès (sur main thread)
* @param OnFailed - Callback appelé en cas d'échec (sur main thread)
*/
void ParseResponseAsync(
const FGuid& RequestId,
const FString& RawJsonData,
FOnParsingCompleted OnCompleted,
FOnParsingFailed OnFailed = FOnParsingFailed()
);
/**
* Parsing synchrone avec timeout (pour les cas urgents)
* @param RawJsonData - Données JSON à parser
* @param TimeoutSeconds - Timeout maximum pour le parsing
* @return Réponse parsée ou nullptr en cas d'échec
*/
TSharedPtr<FDTFluxServerResponse> ParseResponseSync(
const FString& RawJsonData,
float TimeoutSeconds = 1.0f
);
/**
* Annuler toutes les tâches de parsing en attente
*/
void CancelAllParsing();
// === STATISTIQUES ===
/**
* Statistiques de performance du parsing
*/
struct FParsingStats
{
int32 TasksInProgress = 0; // Tâches actuellement en cours
int32 TasksCompleted = 0; // Tâches terminées avec succès
int32 TasksFailed = 0; // Tâches échouées
float AverageParsingTimeMs = 0.0f; // Temps moyen de parsing en ms
};
/**
* Obtenir les statistiques de parsing
*/
FParsingStats GetStats() const;
/**
* Réinitialiser les statistiques
*/
void ResetStats();
private:
// === TRACKING DES TÂCHES ===
mutable FCriticalSection TasksLock;
TSet<FGraphEventRef> ActiveTasks;
// === STATISTIQUES ===
mutable FCriticalSection StatsLock;
mutable int32 TasksCompletedCount = 0;
mutable int32 TasksFailedCount = 0;
mutable TArray<float> ParsingTimes; // Historique des temps de parsing
// === MÉTHODES PRIVÉES ===
/**
* Callback appelé quand une tâche se termine
* @param bSuccess - Succès ou échec de la tâche
* @param ParsingTimeMs - Temps de parsing en millisecondes
*/
void OnTaskCompleted(bool bSuccess, float ParsingTimeMs);
/**
* Nettoyer les tâches terminées de la liste active
*/
void CleanupCompletedTasks();
};
// ================================================================================================
// TÂCHE DE PARSING POUR LE TASKGRAPH
// ================================================================================================
/**
* Tâche de parsing JSON exécutée sur un thread worker
* Compatible avec le TaskGraph d'Unreal Engine
*/
class FDTFluxParsingTask
{
public:
FDTFluxParsingTask(
const FGuid& InRequestId,
const FString& InRawJsonData,
FOnParsingCompleted InOnCompleted,
FOnParsingFailed InOnFailed
);
// === INTERFACE TASK GRAPH ===
FORCEINLINE TStatId GetStatId() const
{
RETURN_QUICK_DECLARE_CYCLE_STAT(FDTFluxParsingTask, STATGROUP_TaskGraphTasks);
}
static FORCEINLINE TStatId GetStatId_DoWork()
{
RETURN_QUICK_DECLARE_CYCLE_STAT(FDTFluxParsingTask_DoWork, STATGROUP_TaskGraphTasks);
}
static FORCEINLINE ENamedThreads::Type GetDesiredThread()
{
// Exécuter sur un thread worker (pas le main thread)
return ENamedThreads::AnyBackgroundThreadNormalTask;
}
static FORCEINLINE ESubsequentsMode::Type GetSubsequentsMode()
{
return ESubsequentsMode::TrackSubsequents;
}
// === EXÉCUTION DE LA TÂCHE ===
/**
* Méthode principale d'exécution de la tâche
* Appelée automatiquement par le TaskGraph sur un worker thread
*/
void DoTask(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent);
private:
FGuid RequestId;
FString RawJsonData;
FOnParsingCompleted OnCompleted;
FOnParsingFailed OnFailed;
double StartTime;
};