Вызов делегата в основном потоке консольного приложения ⇐ C#
Вызов делегата в основном потоке консольного приложения
Я знаю, что в приложении Windows, когда используется несколько потоков, необходимо вызвать основной поток для обновления компонентов графического интерфейса. Как это делается в консольном приложении?
Например, у меня есть два потока: основной и дополнительный. Вторичный поток всегда прослушивает глобальную горячую клавишу; при ее нажатии вторичный поток выполняет событие, которое обращается к методу Win32 API AnimateWindow. Я получаю сообщение об ошибке, поскольку только основному потоку разрешено выполнять указанную функцию.
Как я могу эффективно указать основному потоку выполнить этот метод, когда «Вызов» недоступен?
обновление: если это поможет, вот код. Чтобы увидеть материал HotKeyManager (где в игру вступает другой поток), прочтите ответ на этот вопрос
класс Hud { Bool isHidden = ложь; интервал ключа; частный статический IntPtr windowHandle; public void Init(string[] args) { windowHandle = Process.GetCurrentProcess().MainWindowHandle; НастройкаHotkey(); InitPowershell(args); Очистка(); } частная очистка пустоты() { HotKeyManager.UnregisterHotKey(keyId); } частная пустота SetupHotkey() { keyId = HotKeyManager.RegisterHotKey(Keys.Oemtilde, KeyModifiers.Control); HotKeyManager.HotKeyPressed += новый EventHandler(HotKeyManager_HotKeyPressed); } void HotKeyManager_HotKeyPressed (отправитель объекта, HotKeyEventArgs e) { ПереключитьОкно(); } частная пустота ToggleWindow() { //исключение выдается, поскольку поток, отличный от того, в котором была создана консоль, пытается вызвать AnimateWindow если (скрыто) { if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_NEGATIVE | AnimateWindowFlags.AW_SLIDE)) выдать новое исключение Win32Exception(Marshal.GetLastWin32Error()); } еще { if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_POSITIVE | AnimateWindowFlags.AW_HIDE)) выдать новое исключение Win32Exception(Marshal.GetLastWin32Error()); } isHidden = !isHidden; } частная пустота InitPowershell (строка [] args) { var config = RunspaceConfiguration.Create(); ConsoleShell.Start(config, "", "", args); } }
Я знаю, что в приложении Windows, когда используется несколько потоков, необходимо вызвать основной поток для обновления компонентов графического интерфейса. Как это делается в консольном приложении?
Например, у меня есть два потока: основной и дополнительный. Вторичный поток всегда прослушивает глобальную горячую клавишу; при ее нажатии вторичный поток выполняет событие, которое обращается к методу Win32 API AnimateWindow. Я получаю сообщение об ошибке, поскольку только основному потоку разрешено выполнять указанную функцию.
Как я могу эффективно указать основному потоку выполнить этот метод, когда «Вызов» недоступен?
обновление: если это поможет, вот код. Чтобы увидеть материал HotKeyManager (где в игру вступает другой поток), прочтите ответ на этот вопрос
класс Hud { Bool isHidden = ложь; интервал ключа; частный статический IntPtr windowHandle; public void Init(string[] args) { windowHandle = Process.GetCurrentProcess().MainWindowHandle; НастройкаHotkey(); InitPowershell(args); Очистка(); } частная очистка пустоты() { HotKeyManager.UnregisterHotKey(keyId); } частная пустота SetupHotkey() { keyId = HotKeyManager.RegisterHotKey(Keys.Oemtilde, KeyModifiers.Control); HotKeyManager.HotKeyPressed += новый EventHandler(HotKeyManager_HotKeyPressed); } void HotKeyManager_HotKeyPressed (отправитель объекта, HotKeyEventArgs e) { ПереключитьОкно(); } частная пустота ToggleWindow() { //исключение выдается, поскольку поток, отличный от того, в котором была создана консоль, пытается вызвать AnimateWindow если (скрыто) { if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_NEGATIVE | AnimateWindowFlags.AW_SLIDE)) выдать новое исключение Win32Exception(Marshal.GetLastWin32Error()); } еще { if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_POSITIVE | AnimateWindowFlags.AW_HIDE)) выдать новое исключение Win32Exception(Marshal.GetLastWin32Error()); } isHidden = !isHidden; } частная пустота InitPowershell (строка [] args) { var config = RunspaceConfiguration.Create(); ConsoleShell.Start(config, "", "", args); } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение