From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001 From: giy <giy@omp-system.ru> Date: Fri, 02 Sep 2022 14:16:56 +0300 Subject: [PATCH] Обновление до версии 2.9.0 --- QtVsTools.Core/Messages.cs | 134 ++++++++++++++++++-------------------------- 1 files changed, 56 insertions(+), 78 deletions(-) diff --git a/QtVsTools.Core/Messages.cs b/QtVsTools.Core/Messages.cs index c5eea32..507bcbb 100644 --- a/QtVsTools.Core/Messages.cs +++ b/QtVsTools.Core/Messages.cs @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt VS Tools. @@ -26,34 +26,25 @@ ** ****************************************************************************/ -using EnvDTE; +using System; using System.Collections.Concurrent; -using System.Diagnostics; -using System.Linq; using System.Threading; -using Thread = System.Threading.Thread; using System.Windows.Forms; -using System.Threading.Tasks; +using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Threading; -using QtVsTools.VisualStudio; + +using Task = System.Threading.Tasks.Task; namespace QtVsTools.Core { + using VisualStudio; + public static class Messages { - private static OutputWindow Window { get; set; } private static OutputWindowPane Pane { get; set; } - private static OutputWindowPane _BuildPane; - private static OutputWindowPane BuildPane - { - get - { - return _BuildPane ?? (_BuildPane = Window.OutputWindowPanes.Cast<OutputWindowPane>() - .Where(pane => pane.Guid == "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}") - .FirstOrDefault()); - } - } + private static readonly string PaneName = "Qt VS Tools"; + private static readonly Guid PaneGuid = new Guid("8f6a1e44-fa0b-49e5-9934-1c050555350e"); /// <summary> /// Show a message on the output pane. @@ -69,13 +60,15 @@ FlushMessages(); } - static void OutputWindowPane_Print(string text) + public static void Log(this Exception exception, bool clear = false, bool activate = false) { - OutputWindowPane_Init(); - Pane.OutputString(text + "\r\n"); - // show buildPane if a build is in progress - if (Dte.Solution.SolutionBuild.BuildState == vsBuildState.vsBuildStateInProgress) - BuildPane?.Activate(); + msgQueue.Enqueue(new Msg() + { + Clear = clear, + Text = ExceptionToString(exception), + Activate = activate + }); + FlushMessages(); } /// <summary> @@ -90,50 +83,44 @@ FlushMessages(); } - static void OutputWindowPane_Activate() + static async Task OutputWindowPane_ActivateAsync() { - OutputWindowPane_Init(); - Pane?.Activate(); + await OutputWindowPane_InitAsync(); + await Pane?.ActivateAsync(); } - private static string ExceptionToString(System.Exception e) + private static string ExceptionToString(System.Exception exception) { - return e.Message + "\r\n" + "(" + e.StackTrace.Trim() + ")"; + return $"An exception ({exception.GetType().Name}) occurred.\r\n" + + $"Message:\r\n {exception.Message}\r\n" + + $"Stack Trace:\r\n {exception.StackTrace.Trim()}\r\n"; } private static readonly string ErrorString = SR.GetString("Messages_ErrorOccured"); private static readonly string WarningString = SR.GetString("Messages_Warning"); private static readonly string SolutionString = SR.GetString("Messages_SolveProblem"); - static public void DisplayCriticalErrorMessage(System.Exception e) - { - MessageBox.Show(ErrorString + - ExceptionToString(e), - SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - static public void DisplayCriticalErrorMessage(string msg) + public static void DisplayCriticalErrorMessage(string msg) { MessageBox.Show(ErrorString + msg, SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error); } - static public void DisplayErrorMessage(System.Exception e) + public static void DisplayErrorMessage(System.Exception e) { - MessageBox.Show(ErrorString + - ExceptionToString(e), + MessageBox.Show(ExceptionToString(e), SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error); } - static public void DisplayErrorMessage(string msg) + public static void DisplayErrorMessage(string msg) { MessageBox.Show(ErrorString + msg, SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Error); } - static public void DisplayWarningMessage(System.Exception e, string solution) + public static void DisplayWarningMessage(System.Exception e, string solution) { MessageBox.Show(WarningString + ExceptionToString(e) + @@ -142,7 +129,7 @@ SR.GetString("Resources_QtVsTools"), MessageBoxButtons.OK, MessageBoxIcon.Warning); } - static public void DisplayWarningMessage(string msg) + public static void DisplayWarningMessage(string msg) { MessageBox.Show(WarningString + msg, @@ -158,10 +145,10 @@ FlushMessages(); } - static void OutputWindowPane_Clear() + static async Task OutputWindowPane_ClearAsync() { - OutputWindowPane_Init(); - Pane?.Clear(); + await OutputWindowPane_InitAsync(); + await Pane?.ClearAsync(); } class Msg @@ -171,33 +158,20 @@ public bool Activate { get; set; } = false; } - static bool shuttingDown = false; - static ConcurrentQueue<Msg> msgQueue = new ConcurrentQueue<Msg>(); - static DTE Dte { get; set; } = null; + static readonly ConcurrentQueue<Msg> msgQueue = new ConcurrentQueue<Msg>(); - private static void OnBeginShutdown() + private static async Task OutputWindowPane_InitAsync() { - shuttingDown = true; - } - - private static void OutputWindowPane_Init() - { - if (Dte == null) - Dte = VsServiceProvider.GetService<DTE>(); - var t = Stopwatch.StartNew(); - while (Pane == null && t.ElapsedMilliseconds < 5000) { - try { - Window = Dte.Windows.Item(Constants.vsWindowKindOutput).Object as OutputWindow; - Pane = Window?.OutputWindowPanes.Add(SR.GetString("Resources_QtVsTools")); - } catch { - } + try { if (Pane == null) - Thread.Yield(); + Pane = await OutputWindowPane.CreateAsync(PaneName, PaneGuid); + } catch (Exception ex) { + System.Diagnostics.Debug.WriteLine(ex); } - Dte.Events.DTEEvents.OnBeginShutdown += OnBeginShutdown; } public static JoinableTaskFactory JoinableTaskFactory { get; set; } + static readonly object staticCriticalSection = new object(); static Task FlushTask { get; set; } static EventWaitHandle MessageReady { get; set; } @@ -209,27 +183,21 @@ MessageReady = new EventWaitHandle(false, EventResetMode.AutoReset); FlushTask = Task.Run(async () => { - while (!shuttingDown) { + var package = VsServiceProvider.Instance as Package; + while (!package.Zombied) { if (!await MessageReady.ToTask(3000)) continue; while (!msgQueue.IsEmpty) { - Msg msg; - if (!msgQueue.TryDequeue(out msg)) { + if (!msgQueue.TryDequeue(out Msg msg)) { await Task.Yield(); continue; } - //////////////////////////////////////////////////////////////////// - // Switch to main (UI) thread - await JoinableTaskFactory.SwitchToMainThreadAsync(); if (msg.Clear) - OutputWindowPane_Clear(); + await OutputWindowPane_ClearAsync(); if (msg.Text != null) - OutputWindowPane_Print(msg.Text); + await OutputWindowPane_PrintAsync(msg.Text); if (msg.Activate) - OutputWindowPane_Activate(); - //////////////////////////////////////////////////////////////////// - // Switch to background thread - await TaskScheduler.Default; + await OutputWindowPane_ActivateAsync(); } } }); @@ -237,5 +205,15 @@ } MessageReady.Set(); } + + static async Task OutputWindowPane_PrintAsync(string text) + { + var active = await OutputWindowPane.GetActiveAsync(); + + await OutputWindowPane_InitAsync(); + await Pane.PrintAsync(text); + + (active?.ActivateAsync()).Forget(); + } } } -- Gitblit v1.9.1