Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];
Внизпро 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c