Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
2-1276611901
john-s
2010-06-15 18:25
2010.09.12
Не читает данные из файла


2-1276544773
Цукор5
2010-06-14 23:46
2010.09.12
чтение сокета. ServerSocket1ClientRead


15-1276664088
И. Павел
2010-06-16 08:54
2010.09.12
Самоучители/документация по ABAP и SAP


2-1276374865
AKE
2010-06-13 00:34
2010.09.12
Как нарисовать закрашенный треугольник?


15-1276599769
12
2010-06-15 15:02
2010.09.12
mssql триггер, совсем забыл :(. Так правильно будет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский