Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Критическая секция


Страницы:   1 2

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 отменили?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо