![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Критическая секция
Res © (2008-05-03 20:48:00)Здравствуйте еще раз ) У меня проблема с критической секцией, что она есть что ее нет...
procedure url(page:string);
begin
......
EnterCriticalSection(StringSection);
if(Pos(url+',',urls)>0) then
begin
LeaveCriticalSection(StringSection);
continue;
end;
urls:=urls+url+',';
LeaveCriticalSection(StringSection);
......
Одновременно добавляют 4 потока...
procedure thread(str:string);
begin
....
url(pg);
....
end;
Запускаю потоки:
...
BeginThread(nil,0,Addr(Thread),PCHar(turl),0,id1);
sleep(100);
...
Palladin (2008-05-03 23:04:00) [1]
>Вы о чем?
не нравишься ты ему... :)
ох не нравишься... :)
Res (2008-05-03 22:56:00) [2]
> Если будут "дубликаты", то крит. секция - не причем!
Дубликатов нет
Loginov Dmitry (2008-05-03 22:47:00) [3]> Тебе еще рано учить
Вы о чем?
Loginov Dmitry (2008-05-03 22:45:00) [4]> Во-вторых, там не видно ахинеи.
А как она выглядет? :)
Игорь Шевченко (2008-05-03 22:44:00) [5]Loginov Dmitry © (03.05.08 22:43) [17]
Тебе еще рано учить
Loginov Dmitry (2008-05-03 22:43:00) [6]> Ну мне кажется while побыстрее чем for
Не быстрее. Наоборот! Циклы for в Pascal - лучше оптимизируются и более наглядны!
> Организовал, все равно дубликаты появляются
ну значить у тебя ошибка в программе.
Попробуй с одним потоком. Если будут "дубликаты", то крит. секция - не причем!
Игорь Шевченко (2008-05-03 22:41:00) [7]Loginov Dmitry © (03.05.08 21:58) [5]
> притом, что что у тебя написана охинея полнейшая!
Во-первых, ахинея пишется через "а".
Во-вторых, там не видно ахинеи.
В-третьих, нет ничего единственно правильного.
Loginov Dmitry (2008-05-03 22:39:00) [8]> все остальное - охинея!
хотя нет... не всё. Вспомнил особенность DCOM-сервера с TRemoteDataModule, там чтобы гарантировать, что коннект не выполнится раньше создания главной формы, приходится извращаться, уходя от указанной схемы. Даже такое
EnterCriticalSection(CS);
LeaveCriticalSection(CS);
(захват и освобождение вподряд) приходится применять, если очень надо :)
Res (2008-05-03 22:38:00) [9]
> Что, и циклы for тоже отменили? :)
Ну мне кажется while побыстрее чем for :)
>
> Почему бы не организовать эту процедуру так:
Организовал, все равно дубликаты появляются :(
Loginov Dmitry (2008-05-03 22:24:00) [10]> y:=0;
> while(y<len2) do
> begin
> y:=y+1;
> if(url[y]='/') then z:=y;
> {????? y<len2}
> end;
Что, и циклы for тоже отменили? :)
> if(Pos('.',temp)=0) then
> begin
> urls:=urls+url+',';
> continue;
> end
а этот код почему не защищен?
Почему бы не организовать эту процедуру так:
procedure geturl(page:string);
begin
EnterCriticalSection(StringSection);
try
{ Всю обработку разместить тут! }
finally
LeaveCriticalSection(StringSection);
end;
end;
и убрать все вложенные крит. секции.
DVM (2008-05-03 22:19:00) [11]
> несколько потоков, получают несколько страниц(разных), с
> этих страниц нужно вытащить все урл, процедура выше как
> раз это и делает.. но появляются дубликаты ссылок.. хотя
> идет проверка в критической секции на существования дубликатов.
>
лучше пусть эти твои потоки выбирают все урл и пересылают списки в основной поток (например с собщением), а там уже будет происходить сверка с глобальным списком и добавление в оный.
Res (2008-05-03 22:16:00) [12]
urls - глобальная переменная
Res (2008-05-03 22:15:00) [13]несколько потоков, получают несколько страниц(разных), с этих страниц нужно вытащить все урл, процедура выше как раз это и делает.. но появляются дубликаты ссылок.. хотя идет проверка в критической секции на существования дубликатов.
EnterCriticalSection(StringSection);
try
if(Pos(url+',',urls)=0) then
begin
urls:=urls+url+',';
end;
finally
LeaveCriticalSection(StringSection);
end;
Loginov Dmitry (2008-05-03 22:11:00) [14]> Прочитайте пожалуйста это : Res (03.05.08 21:16) [2]
Что теперь, досканально анализировать этот код?
Лучше объясни, что должно получиться, и что не получается. А-то дублирование какое-то и все тут!
Res (2008-05-03 22:08:00) [15]Прочитайте пожалуйста это : Res (03.05.08 21:16) [2]
Loginov Dmitry (2008-05-03 22:06:00) [16]теперь внимательно вчитываемся в [1], и объясняем, что же все-таки не получается...
Res (2008-05-03 22:02:00) [17]Все равно, не помогает :(
procedure geturl(page:string);
var
x,y,z,h,j:integer; //While
len,len2,right:integer; //?????
url,temp,temp2:string;
begin
len:=length(page);
x:=0;
while(x<len) do
begin
x:=x+1;
if(page[x]='h') then
begin
if(copy(page,x,7)<>'http://') then
begin
continue;
end;
right:=x+8;
while(right<len) do
begin
if(page[right]=' ') or (page[right]=':') or (page[right]='<') or (page[right]='''') or (page[right]='"') or (page[right]='>') or (page[right]=';') or (page[right]='\') or (page[right]='(') or (page[right]=')') or (page[right]=#13) then
begin
break;
end;
right:=right+1;
{????? while}
end;
url:=copy(page,x,right-x);
{?????? ???? ????????? ?????? '/'}
len2:=length(url);
y:=0;
while(y<len2) do
begin
y:=y+1;
if(url[y]='/') then z:=y;
{????? y<len2}
end;
temp:=copy(url,z+1,len2);
if(Pos('.',temp)=0) then
begin
urls:=urls+url+',';
continue;
end
else
begin
if(Pos('?',temp)=0) then
begin
temp2:=copy(temp,Pos('.',temp)+1,len2);
if(temp2='php') or (temp2='htm') or (temp2='html') or (temp2='asp') or (temp2='cgi') then
begin
EnterCriticalSection(StringSection);
try
if(Pos(url+',',urls)=0) then
begin
urls:=urls+url+',';
end;
finally
LeaveCriticalSection(StringSection);
end;
end;
end
else
begin
{???? ???? ???? '?' ? url}
h:=Pos('.',temp);
j:=Pos('?',temp);
temp2:=copy(temp,h+1,j-h-1);
if(temp2='php') or (temp2='htm') or (temp2='html') or (temp2='asp') or (temp2='cgi') then
begin
EnterCriticalSection(StringSection);
try
if(Pos(url+',',urls)=0) then
begin
urls:=urls+url+',';
end;
finally
LeaveCriticalSection(StringSection);
end;
end;
end;
end;
end;
end;
end;
Loginov Dmitry (2008-05-03 21:58:00) [18]> а причем здесь try finally???
притом, что что у тебя написана охинея полнейшая!
Вот единственно правильный код защиты ресурса критической секцией:
EnterCriticalSection(StringSection);
try
{ Обработка данных }
{ Данный код в один момент времени может выполнять только 1 поток! }
finally
LeaveCriticalSection(StringSection);
end;
все остальное - охинея!
Res (2008-05-03 21:48:00) [19]а причем здесь try finally???
Loginov Dmitry (2008-05-03 21:42:00) [20]> LeaveCriticalSection(StringSection);
> continue;
> end;
> urls:=urls+url+',';
> LeaveCriticalSection(StringSection);
Что за бред? try..finally отменили?