Форум: "Начинающим";
Текущий архив: 2008.05.25;
Скачать: [xml.tar.bz2];
ВнизКритическая секция Найти похожие ветки
← →
Res (2008-05-03 20:48) [0]Здравствуйте еще раз ) У меня проблема с критической секцией, что она есть что ее нет...
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);
...
← →
DrPass © (2008-05-03 21:09) [1]А что у тебя не так?
← →
Res (2008-05-03 21:16) [2]Дело в том что
if(Pos(url+",",urls)>0) then
begin
LeaveCriticalSection(StringSection);
continue;
end;
Вот это проверка, что она есть, что ее нет, все равно дубликаты появляются....
← →
Loginov Dmitry © (2008-05-03 21:42) [3]> LeaveCriticalSection(StringSection);
> continue;
> end;
> urls:=urls+url+",";
> LeaveCriticalSection(StringSection);
Что за бред? try..finally отменили?
← →
Res (2008-05-03 21:48) [4]а причем здесь try finally???
← →
Loginov Dmitry © (2008-05-03 21:58) [5]> а причем здесь try finally???
притом, что что у тебя написана охинея полнейшая!
Вот единственно правильный код защиты ресурса критической секцией:
EnterCriticalSection(StringSection);
try
{ Обработка данных }
{ Данный код в один момент времени может выполнять только 1 поток! }
finally
LeaveCriticalSection(StringSection);
end;
все остальное - охинея!
← →
Res (2008-05-03 22:02) [6]Все равно, не помогает :(
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 22:06) [7]теперь внимательно вчитываемся в [1], и объясняем, что же все-таки не получается...
← →
Res (2008-05-03 22:08) [8]Прочитайте пожалуйста это : Res (03.05.08 21:16) [2]
← →
Loginov Dmitry © (2008-05-03 22:11) [9]> Прочитайте пожалуйста это : Res (03.05.08 21:16) [2]
Что теперь, досканально анализировать этот код?
Лучше объясни, что должно получиться, и что не получается. А-то дублирование какое-то и все тут!
← →
Res (2008-05-03 22:15) [10]несколько потоков, получают несколько страниц(разных), с этих страниц нужно вытащить все урл, процедура выше как раз это и делает.. но появляются дубликаты ссылок.. хотя идет проверка в критической секции на существования дубликатов.
EnterCriticalSection(StringSection);
try
if(Pos(url+",",urls)=0) then
begin
urls:=urls+url+",";
end;
finally
LeaveCriticalSection(StringSection);
end;
← →
Res (2008-05-03 22:16) [11]
urls - глобальная переменная
← →
DVM © (2008-05-03 22:19) [12]
> несколько потоков, получают несколько страниц(разных), с
> этих страниц нужно вытащить все урл, процедура выше как
> раз это и делает.. но появляются дубликаты ссылок.. хотя
> идет проверка в критической секции на существования дубликатов.
>
лучше пусть эти твои потоки выбирают все урл и пересылают списки в основной поток (например с собщением), а там уже будет происходить сверка с глобальным списком и добавление в оный.
← →
Loginov Dmitry © (2008-05-03 22:24) [13]> 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;
и убрать все вложенные крит. секции.
← →
Res (2008-05-03 22:38) [14]
> Что, и циклы for тоже отменили? :)
Ну мне кажется while побыстрее чем for :)
>
> Почему бы не организовать эту процедуру так:
Организовал, все равно дубликаты появляются :(
← →
Loginov Dmitry © (2008-05-03 22:39) [15]> все остальное - охинея!
хотя нет... не всё. Вспомнил особенность DCOM-сервера с TRemoteDataModule, там чтобы гарантировать, что коннект не выполнится раньше создания главной формы, приходится извращаться, уходя от указанной схемы. Даже такое
EnterCriticalSection(CS);
LeaveCriticalSection(CS);
(захват и освобождение вподряд) приходится применять, если очень надо :)
← →
Игорь Шевченко © (2008-05-03 22:41) [16]Loginov Dmitry © (03.05.08 21:58) [5]
> притом, что что у тебя написана охинея полнейшая!
Во-первых, ахинея пишется через "а".
Во-вторых, там не видно ахинеи.
В-третьих, нет ничего единственно правильного.
← →
Loginov Dmitry © (2008-05-03 22:43) [17]> Ну мне кажется while побыстрее чем for
Не быстрее. Наоборот! Циклы for в Pascal - лучше оптимизируются и более наглядны!
> Организовал, все равно дубликаты появляются
ну значить у тебя ошибка в программе.
Попробуй с одним потоком. Если будут "дубликаты", то крит. секция - не причем!
← →
Игорь Шевченко © (2008-05-03 22:44) [18]Loginov Dmitry © (03.05.08 22:43) [17]
Тебе еще рано учить
← →
Loginov Dmitry © (2008-05-03 22:45) [19]> Во-вторых, там не видно ахинеи.
А как она выглядет? :)
← →
Loginov Dmitry © (2008-05-03 22:47) [20]> Тебе еще рано учить
Вы о чем?
← →
Res (2008-05-03 22:56) [21]
> Если будут "дубликаты", то крит. секция - не причем!
Дубликатов нет
← →
Palladin © (2008-05-03 23:04) [22]
>Вы о чем?
не нравишься ты ему... :)
ох не нравишься... :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.05.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c