| Потоки | - Thread |
Thread
Краткое описание
Компонент предназначен для создания в программе нового потока
Параметры
Методы
События
Свойства
Пример
Пример использования компонента Thread
Add(MainForm,6208649,70,70)
{
link(onCreate,10354083:doStart,[])
}
Add(For,7740569,182,84)
{
End=100000000
link(onEvent,10153648:doText,[])
}
Add(Thread,10354083,126,84)
{
FastStop=0
link(onExec,7740569:doFor,[])
}
Add(Label,10153648,238,84)
{
Left=130
Top=105
Width=130
Height=28
Font=[MS Sans Serif,16,0,0,1]
}
Замечания
Все компоненты, идущие после метода onExec выполняются в отдельном потоке, т.е. параллельно с основным процессом и другими потоками в программе (если такие есть). Благодаря этому появляется ряд особенностей, о которых нужно помнить при использование потоков в своей программе:
Не рекомендуется изменять внешний вид интерфейсных элементов из схемы, стоящей после метода doExec. Связано это с тем, что все управление визуальными компонентами происходит с помощью асинхронной посылки всевозможных сообщений элементу. Т.е. шевельнули мы мышкой, и Windows уже шлет окну или отдельному элементу сообщение о перемещение мыши с её новыми координатами. Этот механизм иногда нарушается при одновременном манипулирование одним и тем же элементом из основного процесса и из потока. Проявляется это нарушение, начиная от неверной прорисовки до аварийного завершения программы. Стоит аккуратно изменять данные внутри программы, к которым имеет доступ часть схемы, выполняемая в основном процессе и в потоке.
Любое циклическое использование потока без внутренней задержки (т.е. Delay=0) приведет к полной загрузке процессора, если основной процесс не занят работой. Связано это с тем, что внутри потока при ненулевой задержке происходит вызов специального метода, который на заданное количество миллисекунд полностью останавливает выполнение текущего потока, усыпляет его, и процессор отдыхает в это время.
Событие же onSyncExec происходит сразу после события onExec и используется обычно для обновления информации на форме в синхронном режиме. Если коротко, то вызов этого метода заставляет поток приостановить свое выполнение и подождать, пока форма обработает все сообщения Windows, о которых говорится выше. Затем основной процесс так же прерывается на время выполнения всей схемы, идущей после метода. После этого выполнение основного процесса и потока возобновляется. Исходя из описанной логики работы этого метода, стоит отметить, что обновление большого количества элементов или слишком частое обращение к элементам формы сведет на нет весь выигрыш от использования потоков.
Так же следует помнить о том, что метод doStop не работает при вызове его из самого потока. Для этого следует использовать метод doStopFlag, после вызова которого на следующей итерации поток будет остановлен.
Обновление элемента: [svn]Thread.pas[/svn]
Любое циклическое использование потока без внутренней задержки (т.е. Delay=0) приведет к полной загрузке процессора, если основной процесс не занят работой. Связано это с тем, что внутри потока при ненулевой задержке происходит вызов специального метода, который на заданное количество миллисекунд полностью останавливает выполнение текущего потока, усыпляет его, и процессор отдыхает в это время.
Событие же onSyncExec происходит сразу после события onExec и используется обычно для обновления информации на форме в синхронном режиме. Если коротко, то вызов этого метода заставляет поток приостановить свое выполнение и подождать, пока форма обработает все сообщения Windows, о которых говорится выше. Затем основной процесс так же прерывается на время выполнения всей схемы, идущей после метода. После этого выполнение основного процесса и потока возобновляется. Исходя из описанной логики работы этого метода, стоит отметить, что обновление большого количества элементов или слишком частое обращение к элементам формы сведет на нет весь выигрыш от использования потоков.
Так же следует помнить о том, что метод doStop не работает при вызове его из самого потока. Для этого следует использовать метод doStopFlag, после вызова которого на следующей итерации поток будет остановлен.
Обновление элемента: [svn]Thread.pas[/svn]
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)