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

Вернуться   Форум 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 получаю фатальную ошибку (читать комментарии).

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

Просмотров: 5013
 
Непрочитано 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