Вверх ↑
Пакеты 
HiAsm4
Windows 
Компоненты 
Cиcтeмa 
Потоки - Thread

Thread
Краткое описание
   Компонент предназначен для создания в программе нового потока
Параметры
  • Delay - Задержка между итерациями в миллисекундах
  • FastStop - Остановить поток сразу же после первой итерации
  • BusyEvent - Реакция на вызов метода doStart при уже запущенном потоке
  • Методы
  • doStart - Запускает поток на выполнение
  • doStop - Останавливает поток с ожиданием его завершения
  • doStopFlag - Устанавливает флаг завершения потока (мгновенный возврат управления программе)
  • События
  • onExec - Событие происходит только при запущенном потоке с задержкой между итерациями равной Delay (см. Дополнительная Справка)
  • onSyncExec - То же самое, что и событие onExec, только синхронизованное с главным потоком (см. Дополнительная Справка)
  • Свойства
  • Busy - Содержит 1, если поток запущен, или 0 - в противном случае
  • Пример
       Пример использования компонента 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]
  • BB-code статьи для вставки
    Всего комментариев: 0
    (комментарии к статье еще не добавлены)
    Комментарий
    ...