Функция startRule () - это просто правило синтаксического анализа в вашей грамматике. Допустим, ваша грамматика, хранящаяся в файле с именем MyGrammar.g4
, выглядит следующим образом:
grammar MyGrammar;
// A parser rule that matches zero or more ANY_CHAR tokens
// followed by the EOF (end-of-file)
startRule
: ANY_CHAR* EOF
;
// A lexer rule that matches a single character
ANY_CHAR
: .
;
, тогда вы можете вызвать startRule()
для сгенерированного парсера.
Требуется ли счетчик для работы в STA? По этой причине вызов Open () фактически перенаправляется обратно в поток пользовательского интерфейса?
Вы можете убедиться в этом, посмотрев на стек вызовов зависшего потока пользовательского интерфейса в отладчике.
Сколько времени занимает создание экземпляра FancyVoltmeter? Может ли быть так, что не метод Open вызывает зависание пользовательского интерфейса, а создает COM-объект (что делается в потоке пользовательского интерфейса)?
Если это так, перемещение создания этого объекта в случиться в новом, отдельном рабочем потоке, должен позаботиться о проблеме.
Редактировать: Теперь я увидел, что вы уже узнали об этом в своем комментарии к Майклу ...
Рассмотрите возможность использования BackgroundWorker для этой задачи.
Я бы посоветовал вам обернуть вызов meter.open () в отдельный метод и вызвать этот метод из метода updateMeter (), используя конструкцию Invoke () или BeginInvoke () в Форма или родительский контроль. Выполнение этого вернет действие обратно в поток пользовательского интерфейса и должно выполняться изящно. Надеюсь, это поможет.