ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Свойства Handle и ThreadIDproperty Handle: THandle read THandle; property ThreadID: THandle read TThreadID; Свойства Handle и ThreadID возвращают дескриптор и идентификатор потока – объекта операционной системы, который создается для каждого объекта класса TThread. Эти свойства дают программисту возможность непосредственной работы с потоком средствами API Win32, разработчик может обратиться к потоку и управлять им, минуя возможности класса TThread. Значения данных свойств непосредственно используются в качестве аргументов функций, управляющих потоком. Значения этих свойств приходятся при досрочном завершении потока (), синхронизации потоков с помощью функций ожидания (ожидание завершения одного - или нескольких потоков) и т.д. Приоритет потока – свойство Priority property Priority: TThreadPriority; Свойство Priority позволяет запросить и установить приоритет потока. Допустимыми значениями свойства Priority объектов класса TThread являются элементы перечислимого типа TThreadPriority: tpidle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest и tpTimeCritical. Метод Synchronize procedure Synchronize(Method: TThreadMethod); Метод используется для безопасного обращения к объектам VCL (формы и элементы управления) из потоков, отличных от потока формы. Для каждой формы в Delphi свой поток, управляющий ее поведением, и только из этого потока можно безопасно обращаться к форме и ее элементам управления, не используя средства синхронизации. Для обращения к форме из других потоков использование метода Synchronize обязательно. Вызов метода synchronize дает гарантию, что к каждому объекту одновременно имеет доступ только один поток, и таким образом исключается ситуация конфликта. Сложность проблемы в том, что Delphi не контролирует выполнение этого правила и не препятствует обращению в форме из другого потока, формального противоречия в данном случае нет, язык Object Pascal позволяет производить такое обращение. И в некоторых случая программа даже будет работать, но до момента наступления конфликта обращения различных потоков к форме. В принципе, такой конфликт может не происходить продолжительное время, в течение многократных запусков программы. Но затем обязательно произойдет и притом в самый ответственный момент. Отладка многопоточных программ одна из основных сложностей разработки таких программ. Ошибки взаимодействия потоков трудно «отловить», т.к. условия, приведшие к ошибке трудно возобновимы. Метод Synchronize относится к секции protected, т. е. может быть вызван только из потомков TThread. Аргумент, передаваемый в метод Synchronize, - это имя метода, который производит обращение к VCL. Параметр метод (класса TThreadMethod) не должен иметь никаких параметров и не должен возвращать никаких значений. Обычно все операции по вводу-выводу данных потоком группируют в один или несколько таких методов, которые вызывают с помощью метода Synchronize. А проблема отсутствия параметров у метода, передаваемого в качестве аргумента решается за счет переменных уровня класса. procedure TMainForm.SyncShowMessage; begin ShowMessagedntToStr (ThreadListl. Count)); // другие обращения к VCL end; а в потоке для показа сообщения писать не ShowMessage(IntToStr(ThreadListl.Count)); и даже не MainForm.SyncShowMessage; а только так: Synchronize(MainForm.SyncShowMessage); Итак, можно сформулировать основное правило обращения к формам и их элементам управления из потоков. Производя любое обращение к объекту VCL из потока, убедитесь, что при этом используется метод Synchronize; в противном случае результаты могут оказаться непредсказуемыми. Не нашли, что искали? Воспользуйтесь поиском:
|