Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1209913873
223001
2008-05-04 19:11
2008.05.25
вопрос на засыпку


2-1208982779
Жуков Олег
2008-04-24 00:32
2008.05.25
BDE и латышский язык (LANGDRIVER)


2-1209826304
AndreWG
2008-05-03 18:51
2008.05.25
DbGrid


8-1180420857
Demek
2007-05-29 10:40
2008.05.25
Экспорт картинки в 3ds


2-1208965466
Johnnnnnn
2008-04-23 19:44
2008.05.25
input type=file change value, kak?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский