Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.12;
Скачать: CL | DM;

Вниз

про 2 потока и общий стринглист   Найти похожие ветки 

 
tippa ©   (2010-06-14 10:33) [0]

Есть два потока:
-первый сохраняет результат построчно в переменной 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;


 
tippa ©   (2010-06-14 10:44) [1]

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


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

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

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


 
Anatoly Podgoretsky ©   (2010-06-14 10:53) [3]

Не верно


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

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


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

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


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

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

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


 
tippa ©   (2010-06-14 17:19) [7]

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


 
RWolf ©   (2010-06-14 17:50) [8]

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


 
sniknik ©   (2010-06-14 19:23) [9]

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


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


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2010.09.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
2-1274947026
Dzmitry
2010-05-27 11:57
2010.09.12
A call to an OS function failed


4-1239432348
ZZtop24
2009-04-11 10:45
2010.09.12
Как обойти виндовский микшер


15-1276424776
George
2010-06-13 14:26
2010.09.12
Шифрование на Delphi и PHP


6-1214928416
kernel
2008-07-01 20:06
2010.09.12
IdHTTPProxyServer и размер ресурса


2-1276964759
DiamondeX
2010-06-19 20:25
2010.09.12
Режим выбора пользователя