![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
потоки
аврам © (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