Вызов делегата в основном потоке консольного приложенияC#

Место общения программистов 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); } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»