Обновление индикатора прогресса в буревестнике из другого потока - PullRequest
1 голос
/ 06 октября 2011

Я пытаюсь разработать многопоточный плагин в petrel, где мой алгоритм работает в 2 отдельных потока.Плагин, кажется, работает нормально, за исключением того, что я не могу найти какой-либо метод для обновления индикатора выполнения.

с помощью Invoke не обновляет индикатор выполнения (индикатор выполнения c #), и мой пользовательский интерфейс полностью зависает во время выполнения.

Есть ли какой-нибудь способ обновить индикатор выполнения (либо прогресс выполнения буревестника, либо стандартный индикатор выполнения) из другого потока, когда работает алгоритм?

Спасибо

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Используйте Slb.Ocean.Petrel.PetrelLogger.NewAsyncProgress(String, ProgressType) или NewAsyncProgress(String, ProgressType, AsyncProgressCanceledCallback, Object) для обновления индикатора выполнения из фоновых потоков.

2 голосов
/ 12 октября 2011

Control.Invoke работает, только если обработка сообщений потока пользовательского интерфейса не заблокирована.Если ваш основной поток ожидает результата, вам необходимо периодически вызывать Application.DoEvents.

Относительно индикаторов выполнения Petrel: Обычно, если не разрешено взаимодействие с пользователем, используется простой индикатор выполнения, Petrel блокируется до завершения операции.в то время как один или несколько асинхронных индикаторов выполнения используются, если конечный пользователь начинает какую-либо операцию, но он может работать, когда операция выполняется в фоновом режиме.

Если вы выберете первый подход, вы можете, например, сохранить прогресс в переменной, которая видна каждому потоку (убедитесь, что переменная правильно заблокирована), и основной поток может периодически читать эту переменную в цикле и обновлятьпрогресс соответственно.

...