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

Вниз

Критическая секция   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
2-1209890039
Граф
2008-05-04 12:33
2008.05.25
Как отфильтровать по букве, если она встречается не в начале


9-1170430457
Ricks
2007-02-02 18:34
2008.05.25
И мои танчики покритикуйте :)


6-1186129295
ratmir
2007-08-03 12:21
2008.05.25
Как программно поменять IP


2-1209549182
Magos
2008-04-30 13:53
2008.05.25
Определение нажатой клавиши на клавиатуре


2-1209897634
AndrewG
2008-05-04 14:40
2008.05.25
Excel