Как фоновый поток может подвесить поток UI?

Функция 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() для сгенерированного парсера.

5
задан P a u l 30 April 2009 в 02:55
поделиться

4 ответа

Требуется ли счетчик для работы в STA? По этой причине вызов Open () фактически перенаправляется обратно в поток пользовательского интерфейса?

Вы можете убедиться в этом, посмотрев на стек вызовов зависшего потока пользовательского интерфейса в отладчике.

3
ответ дан 14 December 2019 в 19:25
поделиться

Сколько времени занимает создание экземпляра FancyVoltmeter? Может ли быть так, что не метод Open вызывает зависание пользовательского интерфейса, а создает COM-объект (что делается в потоке пользовательского интерфейса)?

Если это так, перемещение создания этого объекта в случиться в новом, отдельном рабочем потоке, должен позаботиться о проблеме.

Редактировать: Теперь я увидел, что вы уже узнали об этом в своем комментарии к Майклу ...

2
ответ дан 14 December 2019 в 19:25
поделиться

Рассмотрите возможность использования BackgroundWorker для этой задачи.

0
ответ дан 14 December 2019 в 19:25
поделиться

Я бы посоветовал вам обернуть вызов meter.open () в отдельный метод и вызвать этот метод из метода updateMeter (), используя конструкцию Invoke () или BeginInvoke () в Форма или родительский контроль. Выполнение этого вернет действие обратно в поток пользовательского интерфейса и должно выполняться изящно. Надеюсь, это поможет.

0
ответ дан 14 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: