Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

потоки


Страницы:   1 2

аврам ©   (2008-11-08 16:39:00) 

Господа, помогите разобраться с потоками, без них трудновато делать программы с разноплановым и пересекающимися функциями.
Может есть какие полезные статьи, буду рад любой информации. Спасибо!
Особо интересует следующее: работает один поток, по мере работы результаты хранятся в каких то переменных, затем они выводятся на форму. т..е. работают с компонентами. Ну и во время рабоыт этого компонента работают еще штук 5-10 а то и больше которые работают до тех пор пока не закончит работать первый. как бы все это организовать.


Аврам   (2008-11-10 20:28:00) [21]

использование потоков делает программу более мощной, только вот всталвопрос о критической или по просьбе пользователя закончить работу всех или некоторых потоков, если я правильно понимаю то у потоков должны быть хендлы, как мне их получать и записывать в какой нить список?
Спасибо вам за ответы!


Loginov Dmitry   (2008-11-09 00:02:00) [22]

> где то читал что работать ппотокам с vcl не хорошо, почему?
>


Каждый визуальный элемент VCL представляет собой окно Windows. При создании окна с ним ассоциируется оконная функция. В дальнейшем любая работа пользователя с окном приводит к вызову оконной фукнции (на деле все немного сложнее). Оконная функция всегда работает в том же потоке, в котором было создано окно (в VCL-в основном потоке), ее можно вызвать только если послать окну сообщение (напр. с помощью SendMessage или PostMessage). Для изменения любых свойств созданного окна ему также следует послать SendMessage или PostMessage. Однако вызов SendMessage из основного потока VCL приводит непосредственно в вызову оконной функции без участия очереди обработки сообщений. В VCL работу с сообщениями упростили, добавив в TControl метод Perform. Теперь практически всюду вместо SendMessage используется метод Perform. Фишка в том, что если из дополнительного потока вызвать Perform (т.е. изменить любое свойство визуального компонента, например TControl.Caption), то сразу будет вызвана оконная функция. Но в этом случае она будет использоваться не по назначению, ей положено работать в основном потоке! Резонно, что подобное явление обязательно будет приводить к накладкам, т.к. будут возникать ситуации, при которых одно и тоже свойство, одна и таже переменная будет изменяться/читаться одновременно из 2х потоков и т.п. Естественно, проблема здесь не в самом методе Perform, а в синхронизации между потоками. Синхронизация позволяет предотвратить одновременный разрушительный доступ к ресурсу из нескольких потоков. В частности, для предотвращения доступа к VCL из дополнительного потока предусмотрен перегруженный метод TThread.Synchronize. Он работает практически как и SendMessage(), т.е. посылает окну Application.Handle определенное сообщение и адрес объектного метода. Оконная функция Application, работающая в основном потоке, обработает полученное сообщение и выполнит вызов заданного метода (в упрощенном виде механизм примерно так и выглядит). После того, как выполнение метода завершится, дополнительный поток вновь продолжит свою работу.


unassigned   (2008-11-08 23:54:00) [23]


> аврам   (08.11.08 23:05) [3]
> где то читал что работать ппотокам с vcl не хорошо, почему?
>  но все же результаты работы потоков должны отображаться
> на форме, как это правильней делать?спасибо!


несколько способов точно есть:
1: через критические секции;
2: отправить сообщение SendMessage(Handle -окна, WM_USER+1, Wparam, lParam); отправка собщения блокирует поток, пока не бедет обработана функция SendMessage()
3 : PostMessage() тоже что и SendMessage() тока не блокируется отпраляющий поток


аврам   (2008-11-08 23:05:00) [24]

где то читал что работать ппотокам с vcl не хорошо, почему? но все же результаты работы потоков должны отображаться на форме, как это правильней делать?
спасибо!


Palladin   (2008-11-08 16:45:00) [25]

http://www.delphimaster.ru/articles/panov/


Сергей М.   (2008-11-08 16:44:00) [26]


> как бы все это организовать


TThread.Synchronize


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо