Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2016, 00:43   #1
Lord_Alexandr
 
Регистрация: 22.01.2013
Сообщений: 9
Сообщение

Здравия бояре! Случилась такая беда - юзаю значит SerialPort, и вроде бы все хорошо читается/пишется, но вот случись нажать на крестик (такой большой красный в углу окошка) при постоянном получении данных с COM порта - прога виснет намертво и выдает богомерзкий System.ObjectDisposedException.
Код:
delegate void SetTextDelegate(String^ text); 
.......
//в одной далекой далекой функции 
if (!this->richTextBox1->IsDisposed) { //проверка состояния объекта
			if (this->richTextBox1->InvokeRequired) //при обращении делегата
			{ 
				SetTextDelegate^ d = gcnew SetTextDelegate(this, &MyForm::SetText); 
				this->Invoke(d, gcnew array<Object^> { text });
				}
			else {
				this->richTextBox1->AppendText("Принято: " + text);
				this->richTextBox1->ScrollToCaret(); //Прокрутка
В итоге валится на ObjectDisposedException, пробовал обработать _FormClosing но ожидаемого результата не достиг. По приходящим данным кажется, что функция вызывается слишком быстро, так как последний IsDisposed вернул false, но richTextBox1 уже того...
А бывает при том же брякпойнте (this->Invoke(d, gcnew array<Object^> { text }) ругается на значения "d", словно что быстрее грохнулось то и виновато....гуру потоков пните нуба в нужную сторону))
Используется VS 2015 C++ CLR/CLI

пытался его через catch (ObjectDisposedException^ ) поймать, чет не прокатило, а в отладке при попытке посмотреть данные richTextBox1 студия вообще падает и перезапускается, ключ в управлении потоками

Последний раз редактировалось Stilet; 12.01.2016 в 09:16.
Lord_Alexandr вне форума Ответить с цитированием
Старый 13.01.2016, 01:19   #2
Lord_Alexandr
 
Регистрация: 22.01.2013
Сообщений: 9
Радость

В данном случае суть всех этих ошибок была простой, нет смысла управлять
Код:
this->Invoke(d, gcnew array<Object^> { text });
через какие либо условия, так как они будут успешно отработаны, после чего начинается непрерывная передача текстового массива, который на одном очередном элементе вдруг обнаруживает внезапную смерть richTextBox1, который был успешно проверен перед началом операции. Поняв это осталось только запретить трогать компоненты пока идет обработка (а не проверять компоненты перед обработкой):
Код:
private: System::Void MyForm_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
	
	if (this->serialPort1->IsOpen) { //если наш порт открыт
		e->Cancel = true; //работает - не трогай
	}
Правда каюсь, пока до меня дошла эта простая истина, я усердно пытался обложить Invoke различными условиями и флагами. Мож я конечно где то ошибаюсь в выводах, как никак в потоках разбираюсь на уровне "никак" :D Но это работает.
Lord_Alexandr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависает VBA при обращении к Google Maps при расчете расстояний AlexTrasko Microsoft Office Excel 1 30.07.2013 10:49
Зависание при работе с HttpWebRequest при обращении к некоторым сайтам Mishiko C# (си шарп) 0 16.08.2012 12:24
Ошибка при обращении к объекту CodeNOT C# (си шарп) 3 28.05.2011 12:47
зависание excel при постоянном обращении к ячейке iamaxl Microsoft Office Excel 1 07.07.2009 18:02