2011-01-11 2 views
3

Это, кажется, легкая задача, я просто не знаю, с чего начать использовать OmniThreadLibrary:Как получить доступ к переменной потока с помощью OmniThreadLibrary?

Я создаю задачу, которая выполняет некоторую обработку в фоновом режиме. Результаты сохраняются в полях класса задачи и постоянно заполняются новыми значениями.

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

Как это можно сделать с помощью OmniThreadLibrary?

ответ

3

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

Вы должны пойти со вторым предложением mghie - создать объект (необязательно на основе интерфейса) и передать этот объект (или его интерфейс) в нить. Что-то вроде этого:

sharedData := TSharedData.Create; 
task := CreateTask(worker).SetParameter('shared', sharedData).Run; 

работник:

sharedData := Task.Param['shared'].AsObject as TSharedData; 

Другой способ решения этой проблемы было бы отправить сообщение «пожалуйста, отправить обновление» к задаче всякий раз, когда пользователь нажимает кнопку UpdateNow. Затем эта задача будет отвечать объекту, содержащему текущее состояние. Однако, если задача выполняет длительный непрерывный расчет, это решение не подходит, и подход с общим состоянием работает лучше.

2

Проверьте тест 23 OTL, который реализует поиск в фоновом режиме. Метод SetParameter() используется для установки свойств поиска, канал Comm используется для передачи результатов обратно в основной поток. Связь уже потокобезопасна, вам не нужно выполнять дальнейшую синхронизацию.

Edit:

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

+0

Как я понимаю, эта демонстрация возвращает результаты в основной поток, когда у него появляются новые результаты. В моем случае основной поток должен только получать текущие значения, когда оператор нажимает кнопку обновления, например. только каждые 1000 раз создается новое значение. Было бы лучше, если бы основной поток мог читать значения только тогда, когда это необходимо. – Holgerwa

Смежные вопросы