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

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

TThread [D6, WinXP]


Страницы:   1 2

__Unknown__ ©   (2007-07-11 19:59:00) 

Хотел спросить, корректно ли
использовать такую конфигурацию!

В потоке за место метода Synchronize() использовать
TCriticalSection!

т.е.:

...
CriticalSection.Enter;
OnData(Self);
CriticalSection.Leave;
...

И следующий вопрос:
Если у меня запущен поток и мне надо добавить в него данные, его обязательно приостанавливать или нет?


Инс   (2007-07-11 21:00:00) [21]


> Т.е. у меня идет также вывод данных с каждого потока на
> экран


"вывод на экран" синхронизировать нужно либо с помощью Syncronize (при этом дочерний поток остановится и подождет, пока главный не выполнит переданный в качестве параметра метод) либо можно послать главному потоку сообщение, получив которое он выполнит нужные действия.

Уважаемый, а не рано ли вы синхронизацией потоков занялись? Может почитать что-нибудь по этой теме сначала?


Инс   (2007-07-11 20:55:00) [22]


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


Ух ты, еще и вЫходной буфер. Боже. Произойдет конечно, если синхронизировать не будете. Одновременно двое пишут в одну и ту же область, как вы думаете, что в этой области будет записано? Синхронизировать надо. В [6] п.2. слово "входным" читать как "выходным", если конечно вы не опечатались.


__Unknown__   (2007-07-11 20:55:00) [23]

Т.е. у меня идет также вывод данных с каждого потока на экран, и я хотел поставить Критическую секцию за место Synchronize, т.к. Synchronize отсылает сообщение к окну основного потока и иногда она не срабатывает скажем при закрытии приложения!


Инс   (2007-07-11 20:51:00) [24]


> [5] __Unknown__   (11.07.07 20:45)


Вот для этого критические секции и нужны. Сделайте так:
1. Заведите по одной критической секции на каждый дочерний поток, сделайте ее свойством потомка TThread
2. Пусть главный поток при добавлении данных получает ссылку на критическую секцию нужного наследника TThread, осуществляет вход, добавляет данные, осуществляет выход.
3. Пусть дочерний поток, перед обращением к входным данным осуществляет вход в свою критическую секцию, работает с данными, осуществляет выход.

Только старайтесь, чтобы код внутри критической секции выполнялся как можо меньше времени, иначе потоки только и будут, что ждать, пока другой освободит критическую секцию.


__Unknown__   (2007-07-11 20:45:00) [25]

>Инс
Смотри, данные приходят и уходят для этого у потока есть два буфера (вход и выход). Т.е. у каждого потока свой буфер с данными, но меня беспокоит такой вопрос. Не произойдет ли ошибка, если во время работы потока я буду добавлять данные в выходной буфер из основной формы, а в это время мой поток их начнет записывать дальше?


Инс   (2007-07-11 20:38:00) [26]

Тут дело не в том, через что создавать поток (к тому же, вместо CreateThread следует использовать BeginThread). Однокамушкин все пояснил. Для того, чтобы синхронизировать с кодом VCL, нужно, чтобы он осуществлял вход в ту же критическую секцию. Ничего подобного в VCL не предусмотрено, это принципиально однопоточная библиотека.

Что Вы хотите сделать?


__Unknown__   (2007-07-11 20:33:00) [27]

Или если не использовать TThread, а создавать поток через CreateThread можно ли использовать CriticalSection для синхронизации с тем же VCL?


Инс   (2007-07-11 20:31:00) [28]


> Если у меня запущен поток и мне надо добавить в него данные


Этот момент лучше бы пояснить...


Однокамушкин   (2007-07-11 20:27:00) [29]

Некорректно...

Synchronize используется для синхронизации с кодом VCL, конкретно - передаёт управление главной нити для того, чтобы она выполнила нужный метод... а критическая секция даёт результат только тогда, когда другая нить тоже использует эту же самую еритическую секцию, чего в коде VCL не наблюдается...

> Если у меня запущен поток и мне надо добавить в него данные,
>  его обязательно приостанавливать или нет?

Нет, если этот поток в момент добавления данных не обращается к ним... Вот тут как раз побойдёт критическая секция, она приостановит ваш поток только в том случае, если он будет выполнять синхронизируемую часть кода, а нет - так пусть его работает...


Страницы:   1 2

Наверх

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