Начал изучать потоки, поправте пожалуйта код

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Vasa2, 11 Nov 2011.

Thread Status:
Not open for further replies.
  1. Vasa2

    Vasa2 Banned

    Joined:
    19 Nov 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    -5
    Начал изучать потоки, поправте пожалуйта код

    Вот часть кода моей программы:

    PHP:
    procedure TNewThread.Execute;
    var 
    CurAcc:integer;
        
    data:Tstringlist;
        
    Responseres:WideString ;
        
    http:tidhttp;
        
    num1:string;
    begin
     
    while Work do
      
    begin
       CS
    .Enter;
       
    Inc(Acc);
       if 
    Acc<Accounts.Count then CurAcc:=Acc else Work:=false;
       
    CS.Leave;

       if 
    Work then
        begin
         FAcc
    := Accounts[CurAcc];
         
    http.get('http://блаблабла'+FAcc);
         
    //Memo1.Text:=http;
         
    try
          
    Reset(FF1);
          while 
    not eof(FF1) do
          
    begin
          ReadLn
    (FF1,num1);
          if (
    Pos(num1,Responseres)<>0then
          Rez
    :=1;
          
    end;
         
    except
          
    if Pos('Set-Cookie: JSESSIONID='HTTP.Response.RawHeaders.Text)<>0 then
           Rez
    :=-1
          
    else
           
    Rez:=0;
         
    end;

         
    Synchronize(Sync);
        
    end;
      
    end;

     
    dec(Thread);
     if 
    Thread=0 then ShowMessage('OK');
    end;

    procedure TNewThread.Sync;
    begin
     
    case Rez of
       0
    :begin
          Accounts
    .Add(FAcc+';'+FPas);
         
    end;
       
    1:begin
          Append
    (GoodFile);
          
    Writeln(GoodFile,FAcc+';'+FPas);
          
    Closefile(GoodFile);
          
    Form1.GoodLabel.Caption:=IntToStr(StrToInt(Form1.GoodLabel.Caption)+1);
          
    Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1;
         
    end;
      -
    1:begin
          Append
    (BadFile);
          
    Writeln(BadFile,FAcc+';'+FPas);
          
    Closefile(BadFile);
          
    Form1.BadLabel.Caption:=IntToStr(StrToInt(Form1.BadLabel.Caption)+1);
          
    Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1;
         
    end;
     
    end;
    end;


    После нажатия на батон выделяется try в этой части кода:



    PHP:
      http.get('http://блаблабла'+FAcc);
         
    //Memo1.Text:=http;
         
    try
          
    Reset(FF1);
          while 
    not eof(FF1) do
     
    #1 Vasa2, 11 Nov 2011
    Last edited: 11 Nov 2011
  2. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Если используете потоки, целесообразней будет работать с файлом через FileStream
     
  3. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Code:
    if Thread=0 then ShowMessage('OK');
    этого в потоке нельзя делать. только через Synchronize
    Code:
    Append(GoodFile);
    нет проверки на существование файла, если файла не будет - потоки будут мереть
    Code:
    AppendFile(F);
    try
      Writeln(F,'Aaaa');
    finally
      CloseFile(F);
    end;
    Вот так вот делайте, тогда если произошла какая-то ошибка записи в файл, он гарантированно будет закрыт
    Code:
       if Work then 
         try 
          Reset(FF1); 
          while not eof(FF1) do 
          begin 
          ReadLn(FF1,num1); 
          if (Pos(num1,Responseres)<>0) then 
          Rez:=1; 
          end; 
         except 
          if Pos('Set-Cookie: JSESSIONID=', HTTP.Response.RawHeaders.Text)<>0 then 
           Rez:=-1 
          else 
           Rez:=0; 
         end;
    Из-за того, что используется Паскалевский метод доступа к файлу работать будет только 1 поток, остальные помрут из-за ошибки доступа к файлу.
    Даже если бы они не померли, у Вас каждый поток бы сначала до конца проверял бы весь файл. Дубликатов бы расплодилось, и толку бы от многопоточности не было
    Code:
         http.get('http://блаблабла'+FAcc);
    это лучше заключать в блок try...except end; иначе поток умрет при ошибке сетевой, или даже при получении редиректа
     
    #3 xophet, 11 Nov 2011
    Last edited: 11 Nov 2011
  4. Vasa2

    Vasa2 Banned

    Joined:
    19 Nov 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    -5
    можно поподробней???
     
  5. PiNgVin07

    PiNgVin07 New Member

    Joined:
    22 Oct 2011
    Messages:
    63
    Likes Received:
    0
    Reputations:
    0
    http://avtuh.ru/2010/10/10/delphi-videourok-mnogopotochnost-i-sinxronizaciya.html , вот там всё есть
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Смотрел я его код (регистратор твиттера). Ерунда там.
    Человек реально считает, что написав в потоке
    Code:
    CS.Enter;
    ...
    CS.Leave;
    при чем критическая секция еще и создается в этом же потоке(!!!)
    он синхронизировал работу потока с потоком VCL;
    так же не проверяет существование файла, и т.д. и т.п.
    В общем книги - это наше все. Видеоуроки по программированию тем более не понимаю.
     
  7. PiNgVin07

    PiNgVin07 New Member

    Joined:
    22 Oct 2011
    Messages:
    63
    Likes Received:
    0
    Reputations:
    0
    xophet, а что есть такие книги по брутам, всяким спаммерам и т.д со скриншотами? Если да, напиши название
     
  8. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Есть книги по программированию, вчасности по потокам: Multithreading - The Delphi Way. Автор - Martin Harvey.
     
  9. Vasa2

    Vasa2 Banned

    Joined:
    19 Nov 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    -5
    если не сложно можно исправить мой код так чтобы он работал (проверка на существование вайла есть, но не в этой части кода)
     
  10. PiNgVin07

    PiNgVin07 New Member

    Joined:
    22 Oct 2011
    Messages:
    63
    Likes Received:
    0
    Reputations:
    0
    А есть такие чтобы по брутам, спамерам, приглашалкам, ну и по потокам? Но чтобы всё вместе?
     
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Есть книги по программированию в общем.
    А как Вы будете применять полученные знания - зависит только от Вас
     
  12. fd00ch

    fd00ch Member

    Joined:
    5 Oct 2010
    Messages:
    18
    Likes Received:
    31
    Reputations:
    9
    накуй пестеть? копипастнул говнокод из инета, теперь предлагаешь другим дописать его за тебя? изучатель, блин...
     
    1 person likes this.
  13. PiNgVin07

    PiNgVin07 New Member

    Joined:
    22 Oct 2011
    Messages:
    63
    Likes Received:
    0
    Reputations:
    0
    ухахахаха, злобно, но справедливо :D
     
  14. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    чем больше вижу многопоточного кода в реализации средствами самой платформы языка - тем больше ужасаюсь
     
  15. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Чтобы ты снова создал тему, похожую на эти:
    Code:
    /showthread.php?t=301721
    /showthread.php?t=302651
    В Delphi работа с потоками реализована нормально. Разве проблемы в коде, который в первом посте.
     
  16. mr_walker

    mr_walker Member

    Joined:
    9 Aug 2009
    Messages:
    41
    Likes Received:
    34
    Reputations:
    2
    А гугл не катит?? Книжки там.. Всякие...
    Или лень?
    Есть такой замечательный автор как Мартин Харви (Martin Harvey) и есть у него отличная книга про многопоточность. Там отлично все разжевывается. Наглядно демонстрируется синхросизация (ТС ты наверное не понимаешь о чем я=)) и вообще что есть поток и как с ним работать. Ну и многопоточность, критичиские секции и вообще масса всего интересного и увлекательного. Можно на просторах великого и необьятного(я про интернет) найти как оригинал так и переведенную версию книги. А вообще, полностью согласен с Chrome~ , зачем продавать копипасту?
    И еще один мой навязчивый и ненужный совет. Изучи сначала основы програмирования.

    Программирование - это творчество, а творить что-то большое нельзя, не сотворив малого..

    и еще...
    Code:
    var
    you_are_stupid: boolean;
    begin
    you_are_stupid:=true;
    while (true) do
    begin
    if you_are_stupid then
    begin
      try
        Synchronize(Study);
      except
        Synchronize(KillYouSelf);
      end;
    end
    else
      Break;
    end;
    Надеюсь все понятно=)
    ОСОБЕННО условие выхода из цикла в потоках=)
    это кстати код для Execute потока=)

    вот это
    Code:
    else    Break;
    забудь вайл должен быть до конца дней твоих!
    Сказал как йодо мастер я....
    что-то разошелся.

    с ув. mr_walker, спасибо тем кто прочитал все...
    и 2раза спасибо тем кто понял=)
     
  17. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Мастер Йода забыл добавить после
    Code:
    Synchronyze(KillYouSelf);
    команду
    Code:
    Continue;
    на тот случай если
    Code:
    UserAlive=True
    :D
    А вообще непонятна проверка
    Code:
     if you_are_stupid then
    на каждой итерации цикла, если другого значения быть не может и цикл продолжается вне зависимости от значения этой переменной
     
  18. mr_walker

    mr_walker Member

    Joined:
    9 Aug 2009
    Messages:
    41
    Likes Received:
    34
    Reputations:
    2
    это и имелось ввиду=) такой цикл должен продолжатся. просто обязан=))


    :D :D :D :D :D :lol:

    Code:
    Continue;
    действительно забыл... аж стыдно))))
    пардонюсь)
     
  19. fd00ch

    fd00ch Member

    Joined:
    5 Oct 2010
    Messages:
    18
    Likes Received:
    31
    Reputations:
    9
    к чему такая жестокость? достаточно вполне гуманного условия:
    while SizeOf(Brain)=0 do ...
     
  20. mr_walker

    mr_walker Member

    Joined:
    9 Aug 2009
    Messages:
    41
    Likes Received:
    34
    Reputations:
    2
    :D
    тогда еще на всякий пожарный код где-то в отдельную процедуру, где будем делать проверку:) :) :)

    Code:
    if SizeOf(Memory)=full then //где full:= Memory.Buffer.MaxSize;
    begin
    Brain:=Memory div 300;
    //т.к. человек использует мозг максимум на 3%
    while SizeOf(Memory)!=0 do
    Dec(Memory); //инициируем удар об стену
    if SyzeOf(Memory)=0 then;
    Inc(full); //увеличим ресурс мозга. Даная строка наглядно демонстрирует фразу "Расширить горизонты"
    end;
    
    я думаю ТС очень помогли наши коллективные замечания :D
    После этого вечный цикл не такая уж и жестокость :D :D
     
Thread Status:
Not open for further replies.