From 2caf2b96f5e04a527724a11ee0d2b097ef22368c Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 14 Nov 2024 11:37:17 +0100 Subject: [PATCH] Mejoras en App,xaml.cs desde Claude --- App.xaml.cs | 226 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 144 insertions(+), 82 deletions(-) diff --git a/App.xaml.cs b/App.xaml.cs index 3d32d54..34f6ad2 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -2,10 +2,9 @@ using System.Data; using System.Windows; using System; -using System.Windows; -using System.Windows.Forms; // Necesitas agregar una referencia a System.Windows.Forms +using System.Windows.Forms; using Application = System.Windows.Application; -using System.Diagnostics; // Asegúrate de incluir esta directiva para usar Stopwatch +using System.Diagnostics; using System.Threading.Tasks; using System.Globalization; using System.Windows.Data; @@ -13,11 +12,6 @@ using System.Runtime.InteropServices; namespace GTPCorrgir { - /// - /// Interaction logic for App.xaml - /// - /// - public partial class App : Application { gtpask GTP = new gtpask(); @@ -26,128 +20,199 @@ namespace GTPCorrgir bool CorreccionFinalizada = false; Stopwatch stopwatch = new Stopwatch(); private notificacion notificationWindow; + private readonly int TimeoutSeconds = 60; // Timeout máximo para esperar la respuesta + private CancellationTokenSource _cancellationTokenSource; KeyboardHelper pasteLogic = new KeyboardHelper(); protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); + _cancellationTokenSource = new CancellationTokenSource(); - pasteLogic.SaveCurrentWindow(); - - if (System.Windows.Clipboard.ContainsText()) + try { - GTP.TextoACorregir = System.Windows.Clipboard.GetText(); + pasteLogic.SaveCurrentWindow(); + + if (System.Windows.Clipboard.ContainsText()) + { + GTP.TextoACorregir = System.Windows.Clipboard.GetText(); + } + + if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir || + Opciones.Instance.modo == Opciones.modoDeUso.Ortografia) + { + GTP.Log.Log("Iniciando proceso de corrección"); + stopwatch.Start(); + + ShowCustomNotification("Espera", $"Corrigiendo texto con {Opciones.Instance.nombreDeLLM()}..."); + IniciarCronometro(); + + // Ejecuta la tarea de corrección con timeout + _ = ProcessCorreccionWithTimeout(); + } + else if (Opciones.Instance.modo == Opciones.modoDeUso.Chat) + { + var chatWindows = new Chat(GTP); + chatWindows.Show(); + } } - - if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir || Opciones.Instance.modo == Opciones.modoDeUso.Ortografia) + catch (Exception ex) { + GTP.Log.Log($"Error en OnStartup: {ex.Message}"); + GTP.Log.Log($"StackTrace: {ex.StackTrace}"); + ShowCustomNotification("Error", "Se produjo un error al iniciar la aplicación"); + Application.Current.Shutdown(); + } + } - stopwatch.Start(); + private async Task ProcessCorreccionWithTimeout() + { + try + { + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(TimeoutSeconds)); + using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource( + timeoutCts.Token, _cancellationTokenSource.Token); - // Muestra notificación inicial y comienza el cronómetro en el hilo de la UI - ShowCustomNotification("Espera", $"Corrigiendo texto con .{Opciones.Instance.nombreDeLLM()} .."); - IniciarCronometro(); - - - // Ejecuta la tarea de corrección en un hilo secundario - Task.Run(async () => + var correccionTask = Task.Run(async () => { try { + GTP.Log.Log("Iniciando corrección de texto"); await GTP.CorregirTexto(); + GTP.Log.Log("Corrección de texto completada"); } catch (Exception ex) { - Console.WriteLine("Error durante la corrección de texto: " + ex.Message); + GTP.Log.Log($"Error durante la corrección: {ex.Message}"); + throw; + } + }, linkedCts.Token); + + await correccionTask; + + await Dispatcher.InvokeAsync(async () => + { + try + { + GTP.Log.Log("Procesando resultado de la corrección"); + CorreccionFinalizada = true; + DetenerCronometro(); + + if (GTP.TextoCorregido != null) + { + GTP.Log.Log("Copiando texto corregido al portapapeles"); + System.Windows.Clipboard.SetText(GTP.TextoCorregido); + ShowCustomNotification("Se puede pegar", + $"Corrección en: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s"); + + if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir) + { + GTP.Log.Log("Mostrando ventana de resultado"); + var resultadoWindow = new VentanaResultado(GTP.TextoCorregido); + resultadoWindow.Show(); + await Task.Delay(1000); + } + else if (Opciones.Instance.modo == Opciones.modoDeUso.Ortografia) + { + GTP.Log.Log("Ejecutando pegado automático"); + pasteLogic.RestoreAndSimulatePaste(); + } + } + else + { + GTP.Log.Log("Error: TextoCorregido es null"); + ShowCustomNotification("Error", "No se pudo obtener el texto corregido"); + } + } + catch (Exception ex) + { + GTP.Log.Log($"Error en el procesamiento final: {ex.Message}"); + ShowCustomNotification("Error", "Error al procesar el resultado"); } finally { - await Dispatcher.Invoke(async () => // Nota el 'async' aquí para permitir 'await' - { - CorreccionFinalizada = true; - DetenerCronometro(); - if (GTP.TextoCorregido != null) - { - System.Windows.Clipboard.SetText(GTP.TextoCorregido); - ShowCustomNotification("Se puede pegar", $"Corrección en : {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s"); - - if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir) - { - var resultadoWindow = new VentanaResultado(GTP.TextoCorregido); - resultadoWindow.Show(); - await Task.Delay(1000); // Asíncrono espera 5 segundos - } - else if (Opciones.Instance.modo == Opciones.modoDeUso.Ortografia) - pasteLogic.RestoreAndSimulatePaste(); - - Application.Current.Shutdown(); - } - else - { - MostrarNotificacion("Error", "No se pudo corregir el texto."); - Application.Current.Shutdown(); - } - }); + GTP.Log.Log("Cerrando aplicación"); + Application.Current.Shutdown(); } }); - } else if (Opciones.Instance.modo == Opciones.modoDeUso.Chat) - { - var chatWindows = new Chat(GTP); - chatWindows.Show(); } + catch (OperationCanceledException) + { + GTP.Log.Log("Operación cancelada por timeout"); + await Dispatcher.InvokeAsync(() => + { + ShowCustomNotification("Error", "La operación excedió el tiempo límite"); + Application.Current.Shutdown(); + }); + } + catch (Exception ex) + { + GTP.Log.Log($"Error no controlado: {ex.Message}"); + await Dispatcher.InvokeAsync(() => + { + ShowCustomNotification("Error", "Se produjo un error inesperado"); + Application.Current.Shutdown(); + }); + } + } + protected override void OnExit(ExitEventArgs e) + { + _cancellationTokenSource?.Cancel(); + _cancellationTokenSource?.Dispose(); + base.OnExit(e); } private void ShowCustomNotification(string title, string message) { - if (notificationWindow == null) + try { - notificationWindow = new notificacion(); - notificationWindow.Show(); + GTP.Log.Log($"Mostrando notificación: {title} - {message}"); + if (notificationWindow == null) + { + notificationWindow = new notificacion(); + notificationWindow.Show(); + } + notificationWindow.UpdateNotification(title, message); } - - notificationWindow.UpdateNotification(title, message); - } - - private void MostrarNotificacion(string titulo, string mensaje) - { - notificacion = new NotifyIcon + catch (Exception ex) { - Icon = SystemIcons.Information, - BalloonTipTitle = titulo, - BalloonTipText = mensaje, - Visible = true - }; - notificacion.ShowBalloonTip(1000); + GTP.Log.Log($"Error al mostrar notificación: {ex.Message}"); + } } - private void IniciarCronometro() { timer = new System.Windows.Forms.Timer(); - timer.Interval = 100; // 1000 milisegundos (1 segundo) + timer.Interval = 100; timer.Tick += ActualizarCronometro; timer.Start(); + GTP.Log.Log("Cronómetro iniciado"); } private void ActualizarCronometro(object sender, EventArgs e) { - if (!CorreccionFinalizada) { - //notificacion.BalloonTipText = $"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds/1000.0,1)} s"; - //notificacion.ShowBalloonTip(1000); - ShowCustomNotification($"{Opciones.Instance.nombreDeLLM()} Trabajando..", $"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s"); + if (!CorreccionFinalizada) + { + ShowCustomNotification( + $"{Opciones.Instance.nombreDeLLM()} Trabajando..", + $"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s" + ); } } private void DetenerCronometro() { - timer.Stop(); - timer.Dispose(); + if (timer != null) + { + timer.Stop(); + timer.Dispose(); + GTP.Log.Log("Cronómetro detenido"); + } } } - public class KeyboardHelper { [DllImport("user32.dll", SetLastError = true)] @@ -182,7 +247,4 @@ namespace GTPCorrgir keybd_event((byte)VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, UIntPtr.Zero); // Ctrl Release } } - - - -} +} \ No newline at end of file