Главная страница
    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
15-1207820014
Галинка
2008-04-10 13:33
2008.05.25
Как получить из dll параметры


15-1207803349
@!!ex
2008-04-10 08:55
2008.05.25
Комп пикает спикером, мышка зависает.


2-1209892032
filin2323
2008-05-04 13:07
2008.05.25
скрытие формы


2-1209459593
npr2
2008-04-29 12:59
2008.05.25
вывод из дочернего потока на форму значения


2-1209748683
Res
2008-05-02 21:18
2008.05.25
RegSetValueEx &amp;&amp; REG_DWORD





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