| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Фатальная ошибка при попытке мониторинга изменения файла настроек.

Фатальная ошибка при попытке мониторинга изменения файла настроек.

Ответ
Поиск в этой теме
Непрочитано 22.03.2010, 18:07 #1
Фатальная ошибка при попытке мониторинга изменения файла настроек.
hwd
 
C, C++, C#
 
С-Пб.
Регистрация: 07.10.2009
Сообщений: 2,762

Код:
[Выделить все]
...
   1:          /// <summary>
   2:          /// Конструктор по умолчанию. В нём производится начальная инициализация внутренних полей объекта.
   3:          /// </summary>
   4:          public HwdCommands()
   5:          {            
   6:              dwg = acad.DocumentManager.MdiActiveDocument;
   7:              db = dwg.Database;
   8:              ed = dwg.Editor;            
   9:              justification = "BL";//Выравнивание текста по умолчанию
  10:              xmlFileName = "Settings.xml";
  11:              try
  12:              {
  13:                  //Получаем XML-объект, инкапсулирующий в себе информацию файла настроек
  14:                  string settPath = new FileInfo(Assembly.GetAssembly(this.GetType()).Location).DirectoryName;
  15:                  doc = XElement.Load(Path.Combine(settPath, xmlFileName));
  16:   
  17:                  //Если в процессе работы AutoCAD произойдет изменение xml-файла настроке, следует известить об этом пользователя.
  18:                  FileSystemWatcher watcher = new FileSystemWatcher(settPath, xmlFileName);
  19:                  //Отслеживаемым назначаю событие изменения файла
  20:                  watcher.NotifyFilter = NotifyFilters.LastWrite;  
  21:                  //Подписываюсь на уведомление
  22:                  watcher.Changed += new FileSystemEventHandler(watcher_Changed);
  23:                  //Запускаю мониторинг
  24:                  watcher.EnableRaisingEvents = true;
  25:   
  26:                  //Группа команд создания объектов однострочного текста
  27:                  cmdGroup = doc.Element("CommandGroups").Elements().Where(n => n.Attribute("GroupName").Value == "Text").First();
  28:              }
  29:              catch (System.Exception ex)
  30:              {
  31:                  ed.WriteMessage(ex.Message);
  32:              }
  33:              dwg.CommandEnded += new CommandEventHandler(dwg_CommandEnded);
  34:              dwg.CommandFailed += new CommandEventHandler(dwg_CommandEnded);
  35:              dwg.CommandCancelled += new CommandEventHandler(dwg_CommandEnded);            
  36:          }
  37:          //Если произошло изменение файла - уведомить об этом пользователя и произвести реинициализацию данных
  38:          void watcher_Changed(object sender, FileSystemEventArgs e)
  39:          {
  40:              ed.WriteMessage(string.Format("\nПроизошло изменение файла {0}\n", xmlFileName));//В этой строке AutoCAD выдаёт Fatal Error 
  41:              //из которого даже отказывается выходить (т.е. не реагирует на клавиатуру).
  42:   
  43:              string settPath = new FileInfo(Assembly.GetAssembly(this.GetType()).Location).DirectoryName;
  44:              doc = XElement.Load(Path.Combine(settPath, xmlFileName));            
  45:          }
...
в строках 17-24 производится настройка и инициализация мониторинга файла настроек на предмет его изменения.

Как только файл настроек подвергается изменению, в строке 40 получаю фатальную ошибку (читать комментарии).

Выглядит сие так:

Просмотров: 5018
 
Непрочитано 22.03.2010, 18:52
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Не используй ed.WriteMessage в этом событии.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 22.03.2010, 18:57
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Не используй ed.WriteMessage в этом событии.
хотелось бы понять, почему использование ed.WriteMessage приводит к столь печальным последствиям. Метод предпочтителен для ненавязчивого оповещения об изменениях. Создавать и отображать модальное окно с сообщением не хочу (и не факт, что в этом случае ошибки не будет).

Последний раз редактировалось hwd, 22.03.2010 в 20:29.
hwd вне форума  
 
Непрочитано 23.03.2010, 01:46
#4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Метод предпочтителен для ненавязчивого оповещения об изменениях. Создавать и отображать модальное окно с сообщением не хочу (и не факт, что в этом случае ошибки не будет).
Проверь. Не забывай, что AutoCAD очень плохо относится к многопоточному программированию. Возможно причина в этом.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 23.03.2010, 10:42
#5
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Проверь. Не забывай, что AutoCAD очень плохо относится к многопоточному программированию. Возможно причина в этом.
Я пока не понял, как создавать акадовское окно:
С помощью new его создать не возможно.
Window win = Window.Create(... а далее идут не понятные мне параметры: Тип, IntPtr... это млин не WinForms к сожалению...

Если данная проблема вызвана многопоточностью, то открытие Window так же вряд ли поможет. Однако я с синтаксисом пока не разобрался...

п.с. Я тоже думаю, что проблема может быть вызвана многопоточностью, однако надеялся, что в связи с тем, что подписка на данное событие не изменяет базу данных чертежа - проблем не возникнет. Жаль, что в классе Application фирма Autodesk не предусмотрела такую вещь как диспетчер, подобно тому, как он присутствует в WPF, и предназначенный как раз для того, чтобы выполнять в основном потоке действия, запрошенные из др. потоков.

вместо открытия окна с сообщением попытался сделать это:
Код:
[Выделить все]
acad.DocumentManager.MdiActiveDocument.Window.Text = string.Format("Произошло изменение файла {0}", xmlFileName);
По прежнему фатал эррор, из которого автокад даже выходить отказывается.

Последний раз редактировалось hwd, 23.03.2010 в 10:58.
hwd вне форума  
 
Непрочитано 24.03.2010, 22:44
#6
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


А что, если в классе HwdCommands создать переменную типа FileSystemEventArgs и сохранять в ней аргумент, принимаемый обработчиком watcher_Changed. А по окончании текущей команды (функции) проверять эту переменную и печатать результат. В этом случае обращение к ed.WriteMessage будет в основном потоке и все должно работать.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 24.03.2010, 23:00
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Pastor Посмотреть сообщение
А по окончании текущей команды (функции)...
В примере я производил изменения в xml-файле вне сеанса работы какой -либо команды.
hwd вне форума  
 
Непрочитано 24.03.2010, 23:45
#8
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Но ведь существует же функция (команда), для которой эти изменения существенны. Вот пусть она и печатает сообщение.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Фатальная ошибка при попытке мониторинга изменения файла настроек.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избавиться от запроса при загрузке файла dwg "Выбор файла формата" newludmila AutoCAD 28 18.11.2009 19:04
Мониторы LCD CRT Разное 94 17.06.2008 10:51
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41
При запуске АВтокада возникоет фатальная ошибка NTU AutoCAD 4 03.02.2005 17:22