Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как безопасно показать ShowDialog? 
:(
    Опции темы
sip
Дата 31.7.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Подскажите, пожалуйста: приходящее сообщение с СОМ порта, по событию, вызывает метод. Внутри метода делаю Me.Invoke...(BeginInvoke тоже пробовал), чтобы показать юзеру сообщение с помощью ShowDialog. Хочу чтобы юзер принял решение, перед тем как продолжить. Периодически программа рушится, даже эксепшн словить не могу (не помогает словить даже AppDomain.CurrentDomain.UnhandledException). Подскажите как безопасно показать юзеру модальное окно и получить от него ответ.
PM MAIL   Вверх
Partizan
Дата 31.7.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



sip, а зачем Me.Invoke???


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
sip
Дата 31.7.2008, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата(Partizan @ 31.7.2008,  20:59)
sip, а зачем Me.Invoke???

Чтобы показывать диалог в главном потоке. Ведь если не делать Invoke, то диалог будет вызываться в новом потоке, который создало событие. Что я делаю не так?
PM MAIL   Вверх
Partizan
Дата 31.7.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



sip, я про многопоточность в первом посте не вижу ни слова


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
sip
Дата 31.7.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата(Partizan @ 31.7.2008,  21:12)
sip, я про многопоточность в первом посте не вижу ни слова

да, стоило уточнить, что метод вызываемый событием выполняется в новом потоке. 
Как правильно нужно сделать в такой ситуации?
PM MAIL   Вверх
Partizan
Дата 31.7.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



sip, код покажите...и какую инфу об исключении говорит дебаггер вам


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
sip
Дата 31.7.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Partizan,  Дебаггер не ловит исключение, прога просто закрывается и все. Это происходит один раз на примерно 5-7 удачных показов диалога...

Код

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    AddHandler MyDevice.IncomingEvent, AddressOf OnIncomingEvent
    ...
  End Sub

  Private Delegate Sub OnIncomingEventDelegate()
  Private Sub OnIncomingEvent()
    If InvokeRequired Then
      Me.Invoke(New OnIncomingEventDelegate(AddressOf OnIncomingEvent))
    Else
      response = dlgForm.ShowDialog("Are you sure? Yes or No.")
      ...
    End If
  End Sub



PM MAIL   Вверх
Partizan
Дата 31.7.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



потоков всё  также в упор не вижу


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
sip
Дата 31.7.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата(Partizan @ 31.7.2008,  21:56)
потоков всё  также в упор не вижу

Когда приходит событие, то OnIncomingEvent() автоматически вызывается в новом потоке.
PM MAIL   Вверх
Partizan
Дата 31.7.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



вот эти две строчки как-то подозрительно выглядят

 If InvokeRequired Then
      Me.Invoke(New OnIncomingEventDelegate(AddressOf OnIncomingEvent))


Добавлено @ 22:09
может всё-таки вам стоит вызвать dlgForm.Invoke(делегат(dlgForm.ShowDialog)); ???

Это сообщение отредактировал(а) Partizan - 31.7.2008, 22:09


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
sip
Дата 31.7.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Эта строка и проверяет в каком потоке находимся, и если нужен Invoke, то делаем его. Только что-то не совсем работает.
PM MAIL   Вверх
Partizan
Дата 31.7.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



sip, Добавлено @ 22:09
может всё-таки вам стоит вызвать dlgForm.Invoke(делегат(dlgForm.ShowDialog)); ???


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
sip
Дата 31.7.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата(Partizan @ 31.7.2008,  22:13)
sip, Добавлено @ 22:09
может всё-таки вам стоит вызвать dlgForm.Invoke(делегат(dlgForm.ShowDialog)); ???

не понимаю почему именно так нужно делать?
PM MAIL   Вверх
Дрон
Дата 1.8.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 93



Цитата(Partizan @  31.7.2008,  22:13 Найти цитируемый пост)
может всё-таки вам стоит вызвать dlgForm.Invoke(делегат(dlgForm.ShowDialog)); ??? 

Не, мне кажется это не то. Этот код как я понимаю и так находится внутри формы, так что обращение к Me должно дать правильный результат.

У меня есть подозрение что дело даже не в показе диалога, всё-таки не должна бы программа так просто выключаться. Может там чего-то более сложное происходит, связанное с взаимодействием с COM-портом. Например, что происходит если пользователь долго ничего не отвечает на модальный диалог, а в это время с устройства приходит ещё одно событие, но поток-то заблокирован вызовом Invoke? Или ещё что-нибудь в этом духе, по этому куску кода ничего подозрительного не вижу.


--------------------
Да. Именно так.
PM   Вверх
Partizan
Дата 1.8.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



ну лично у меня вызвает подозрения этот потенциально вызывающий зацикливание код:

  Private Sub OnIncomingEvent()
    If InvokeRequired Then
      Me.Invoke(New OnIncomingEventDelegate(AddressOf OnIncomingEvent))


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.