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

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

про 2 потока и общий стринглист


tippa ©   (2010-06-14 10:33:00) 

Есть два потока:
-первый сохраняет результат построчно в переменной TStringList
-второй проверяет, есть ли строки в этой переменной, и если есть, то читает первую строку в свою переменную и в стринглисте удаляет эту первую строку.
Использую критические секции.
В первом потоке сохраняю результат через ->
EnterCriticalSection(cs);
list.Add(str);
LeaveCriticalSection(cs);

Во втором в цикле проверяю list на наличие строк ->
while true do
begin
sleep(1000);
//EnterCriticalSection(cs);//тут должна начинаться критическая секция?
if list.Count>0 then
//EnterCriticalSection(cs);//или тут?
s:=list.Items[0];
list.delete(0);
LeaveCriticalSection(cs);
end;


Плохиш   (2010-06-15 09:58:00) [1]

http://www.swissdelphicenter.ch/de/showcode.php?id=2167


_Юрий   (2010-06-14 19:24:00) [2]


> sniknik ©   (14.06.10 14:26) [6]


> в такой реализации нужна


Да, это я погорячился )


sniknik   (2010-06-14 19:23:00) [3]

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


RWolf   (2010-06-14 17:50:00) [4]

смотря какая переменная.
если, скажем, int64, второй поток может прочитать переменную во время её модификации (запись 64 бит в память занимает 2 команды).


tippa   (2010-06-14 17:19:00) [5]

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


sniknik   (2010-06-14 14:26:00) [6]

> секция будет не нужна
в такой реализации нужна, т.к. обращение к разделяемому ресурсу. потом, после события, на чтении/удалении.

тут другое не нужно, второй поток (а может и первый). вот разве отработка строки такая длительная, что для нее отдельный поток требуется выделять? почему не обработать там же где получили? тогда и стринглист не нужен и критические секции (а если получение идет в каком нибудь событии, типа, например http get то и первый поток лишний)


_Юрий   (2010-06-14 12:28:00) [7]

А вообще, если второй поток занимается только тем, что ждет, пока в листе  не появится строка, лучше сделать не через бесконечный цикл, а через ожидание события (SetEvent, WaitForSingleObject) - тогда процессор не будет занят бесполезной работой по кручению цикла, и крит.  секция будет не нужна


_Юрий   (2010-06-14 12:24:00) [8]

В данном коде вся работа с листом должна быть внутри секции, в том числе и получение количества элементов. И желательно  обрамлять в try \ finally, во избежание...


Anatoly Podgoretsky   (2010-06-14 10:53:00) [9]

Не верно


Anatoly Podgoretsky   (2010-06-14 10:46:00) [10]

> tippa  (14.06.2010 10:33:00)  [0]

А вопрост то у тебя есть?


tippa   (2010-06-14 10:44:00) [11]

вроде доехал.
если потока 2 то можно начанать кртическую секцию и после оператора if
но если потоков, которые читают из стринглиста больше одного, тогда критическую секцию начинаем перед условием.
Вроде верно?


Наверх

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