Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 10.11.2015
Сообщений: 37
.NET 4.x

MessageBox, модальность и STA

10.11.2015, 13:35. Показов 2029. Ответов 6

Студворк — интернет-сервис помощи студентам
Проект создан в VS 2013.
По таймеру обрабатываю обращение к виртуальному COM-порту. Соответсвенно, отлавливаю исключения и в случае невозможности получить доступ к порту выдаю:

C#
1
MessageBox.Show("Ошибка открытия порта.\n" + ex.Message, "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
Так вот, почему окно не модальное? Т.е. можно переключаться между главным окном и MessageBox? Метода ShowDialog, как я понял, у MesageBox нет.

Ладно, думаю, создам DialogWindow, затем ShowDialog() и будет мне счастье. Но при исполнении кода получаю:

Additional information: The calling thread must be STA, because many UI components require this.;

Читал, что в таком случае необходимо перед Main() прописать [STAThread]. У меня же MainWindow(). Если прописать перед, то получаю ошибку компилятора:

Attribute 'STAThread' is not valid on this declaration type. It is only valid on 'method' declarations.

В общем, вопрос: как выдавать модальное окно с предупреждением о недоступности COM-порта? Ну или хотя бы, чтобы окно с предупреждением всегда было поверх главного окна даже если можно переключиться на главное окно.

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2015, 13:35
Ответы с готовыми решениями:

Потоки. STA
Пишу клиент-серверное приложение. В клиенте есть целый класс для работы с сервером (получает команды, обрабатывает, отвечает на них и...

Тестирование WPF UserControl: Вызывающим потоком должен быть STA
Создал элемент управления и сейчас стоит задача его протестировать. Но после написания тест выдаёт такую ошибку: SetUp :...

System.InvalidOperationException: "Вызывающим потоком должен быть STA
Добрый вечер:) есть Вот такой код: Метод на форме Window1 public void FIRSЕ_DOWNLOAD() { if...

6
1 / 1 / 0
Регистрация: 10.11.2015
Сообщений: 37
13.11.2015, 11:08  [ТС]
Ладно, отвечу сам себе.
В WPF необходимо использовать DispatcherTimer из System.Windows.Forms вместо Timer, иначе это другой поток со всеми вытекающими.
0
1 / 1 / 1
Регистрация: 25.09.2013
Сообщений: 47
13.11.2015, 11:42
C#
1
2
3
4
Dispatcher.Invoke((Action) delegate
            {
             //...   
            });
0
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
13.11.2015, 11:52
Цитата Сообщение от i_Byte Посмотреть сообщение
Ладно, отвечу сам себе.
В WPF необходимо использовать DispatcherTimer из System.Windows.Forms вместо Timer, иначе это другой поток со всеми вытекающими.
Нет. Надо для MessageBox нужно установить владельца (как правило это главное окно приложения) от которого он работает, в Вашем случае должен быть вызов вида:
C#
1
MessageBox.Show(this.MyMainWindow, "Ошибка открытия порта.\n" + ex.Message, "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
0
1 / 1 / 0
Регистрация: 10.11.2015
Сообщений: 37
13.11.2015, 13:13  [ТС]
2 Martovskij.

Спасибо. Но, во-первых Петзольд все-таки рекомендует использовать DispatcherTimer (хотя, конечно, с другой стороны, книга от 2008 года). А во-вторых это все равно будет другой поток, и, как я понимаю, для доступа к той же Label надо будет использовать делегата. А DispatcherTimer работает в том же потоке, что меня, собственно, и устраивает.
0
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
13.11.2015, 13:56
Цитата Сообщение от i_Byte Посмотреть сообщение
abel надо будет использовать делегата. А DispatcherTimer работает в том же потоке, что меня, собственно, и устраивает.
Справедливо, если использовать полноценное окно. У вас же обычный messagebox.
Это что ж за задача, в которой нужен доступ к Label у месседж бокса?
0
1 / 1 / 0
Регистрация: 10.11.2015
Сообщений: 37
13.11.2015, 15:16  [ТС]
Цитата Сообщение от Martovskij Посмотреть сообщение
Справедливо, если использовать полноценное окно. У вас же обычный messagebox.
Это что ж за задача, в которой нужен доступ к Label у месседж бокса?
Все до банального просто. Есть устройство собирающее данные, в частности температуру. Прога запускается, считывает накопленные данные. А если прога запущена, то переодически считывает данные и отображает самые важные текущие, например в Label.
В общем - тут же не просто MessageBox. Тут полноценное окно с Control'ами, а MessageBox нужен для оповещения юзеру о критической ошибке: устройство отвалилось или порт подвис. Соотвественно, опрос по таймеру, если Timer - то это другой поток. А меня пока один устраивает. А в будущем, может, когда весь функционал будет готов, можно и в отдельный поток вывести опрос устройства. А может и не понадобится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2015, 15:16
Помогаю со студенческими работами здесь

Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны
пишет:Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны. Проверьте, что ваша...

Модальность
Как окно наследник CFrameWnd сделать модальным? И можно ли это сделать?

Модальность
Здрасти, как в форме сделать прогрессбар модальным(чтобы держал фокус все время)? в отдельном потоке идет запись на диск, в основном...

Окна: модальность и прочее
Дорый день! Пишу прогу, основанную на группе диалогов: один основной, 5-6 вспомогательных (могут находится на экране вместе с...

Проверка формы на модальность
Помогите прлиззззззззззззз!!! Возможно ли как нить при помощи условий выяснить какая форма проекта является модальной, ну что нить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru