Delphi (видеоурок). Многопоточность и синхронизация

10 октября 2010    

В этом видеоуроке показано, как создать многопоточное приложение и правильно синхронизировать потоки между собой.
Надеюсь видео о добавлении одного потока вы уже видели. Теперь немного о критических секциях и методе Synchronize.

YouTube Трейлер


Похожие записи из категории Видеоуроки Delphi

  • Delphi (видеоурок). Дополнительный поток в программе
  • Delphi – Indy (видеоурок). Регистрация на Rambler’е
  • Delphi – Indy (видеоурок). Авторизация на одноклассниках
  • Нравится


    Метки: , , , , , , , Рубрика: Видеоуроки Delphi


    обсуждение

    1. SyavaK пишет:

      спасибо за урок
      я написал чекер на другом языке и хочу переписать на С
      может ктото выложить исходник написаный на С ?
      и хотелось бы увидеть урок по использованию прокси
      в такого рода програмах это уже какбы неизбежно )

      [Ответить]

    2. SyavaK пишет:

      написал чекер взял за основу ваш пример
      возможно ли что этот пункт невыполнится ?
      Accounts.Add(FAcc+’;'+FPas);
      если возможно то по какой причине и как с этим боротся
      просто у меня чекер заканчивает проверку непроверив все аккаунты
      постоянно несколько остаётся (каждый раз по разному)
      и под конец заметно падает скорость
      возможно ли что потоки подвисают ?
      если да то изза чего и как с этим боротся
      спс за пример и за ответ если такой будет

      [Ответить]

    3. SyavaK пишет:

      ошибки отлавливаю так
      HTTP.Get(‘http://2ip.ru/',data);
      except
      on E: Exception do err:= 1;

      [Ответить]

      Zdez Bil Ya Reply:

      что такое data в вашем запросе? Запрос Get, т.е. без параметров. Что тогда такое data?

      [Ответить]

    4. SyavaK пишет:

      страница получаемая с 2ip.ru

      [Ответить]

      Zdez Bil Ya Reply:

      Тестируйте на небольшом количестве, подробно записывая все действия в лог

      [Ответить]

    5. SyavaK пишет:

      data:= TMemoryStream.Create;
      page := TStringList.Create;
      data.Position := 0;
      page.LoadFromStream(data);
      MessageBox(Form1.Handle,PChar(page.strings[109]),’Страница 109 с сайта 2 ип’ , MB_OK) ;

      [Ответить]

    6. SyavaK пишет:

      ой там строка 109 )

      [Ответить]

    7. SyavaK пишет:

      про логи я понимаю что это необходимо и так я и сделаю только стараюсь оттянуть этот момент (мож всётаки по логике удасца найти проблему )))
      я всётаки грешу на эту строчку
      Accounts.Add(FAcc+’;'+FPas);
      чекер завершает работу и выводит
      dec(Thread);
      if Thread=0 then
      MessageBox(Form1.Handle,’Проверка завершена’, ‘Сообщение’, MB_OK)
      кстать меседжбокс поставил вместо шовмеседж так как с шовмеседж после выключения чекера выскакивала ошибка
      так вот если чекер выводит ОК в конце знач потоков уже нет
      тогда почему не все акки проверил?
      думаю какраз изза Accounts.Add(FAcc+’;'+FPas);
      возможно ли что пару потоков пытаются записать одновременно изза чего и не добавляется акк?
      если такое возможно то может это тоже нужно добавить в критическую секцию?
      если возможно и можна добавить в крит секцию то нужно создавать новую или таже CS может быть ?
      извините если чего глупого наплёл, с делфи только начинаю )

      [Ответить]

      Zdez Bil Ya Reply:

      Быть может всё. Лог – самое лучшее решение: видно, что, где и когда проверяется и делается

      [Ответить]

    8. unknownproject пишет:

      Здравствуйте.Насколько я понял логику Вашей программы, то она проверяет валидность аккаунта по присутствующей куке, а как можно реализовать проверку валидности, исходя из появляющегося сообщения об ошибке, свидетельствующей о том, что мы не прошли авторизацию ?

      Я представляю себе это так (укажу только участок проверки):

      if Pos(‘Ошибка авторизации’, HTTP.ResponseText)0 then
      Result:=1
      else
      Result:=0;

      Поправьте, если я не прав.И насколько я понял, то в вашем кодер результат 1 означает успешную авторизацию, а 0 – ошибочную.Спасибо за Внимание.Приму любой Ваш ответ

      [Ответить]

    9. unknownproject пишет:

      Ой, я ошибся, получается, что в моем случае код будет вида:

      Result:=0
      else
      Result:=1;

      Надеюсь на Вашу помощь =)

      [Ответить]

    10. LOl пишет:

      Как сделать чекер для origin по этому исходнику?

      [Ответить]

    11. Beny пишет:

      Really interesting, thanks !
      I would be interested to know how do you setup a STOP button.
      Of course you’ll turn WORK to FALSE but you’ll have to wait the end of threads started…

      Using a ThreadList or EventHandler ?

      Beny

      [Ответить]

    12. berik1337 пишет:

      А на каком delphi ты писал её ?
      delphi 7 или что … ?

      [Ответить]

    13. NEoMASTERR пишет:

      У меня проблемка с потоками, пытался завершить потоки всеми способами которые знаю и ни один не работает корректно, постоянно вылезают ошибки (рантайм эррор бла бла)

      //////////////BEGIN CREATE//////////////
      var
      i:integer;
      begin
      works:=true; //для цикла
      SetLength(fakeserver,se3.Value); //кол-во потоков
      maxservers:=se3.Value;
      for i:=1 to maxservers do
      begin
      fakeserver[i]:=TFakeServer.Create(true);
      fakeserver[i].udp:=tmyudpserver.Create(nil);
      fakeserver[i].udp.num:=i;
      fakeserver[i].FreeOnTerminate:=true;
      fakeserver[i].Priority:=tpLower;
      fakeserver[i].Resume;
      end;
      tmr1.Enabled:=true; //для показа счетчика потоков
      end;
      //////////////END CREATE//////////////

      //////////////BEGIN TERMINATE//////////////
      tmr1.Enabled:=False;
      works:=False;
      if maxservers0 then
      begin
      for i:=1 to maxservers do
      begin
      fakeserver[i].Terminate;
      end;
      end;
      //////////////END TERMINATE//////////////

      ну и код потока

      procedure TFakeServer.execute;
      begin
      Inc(thrcount);
      udp.OnUDPRead:=onudpread;
      while works=true do
      begin

      end;
      udp.Free;
      Dec(thrcount);
      end;

      Пробовал уже и while not Terminated получается то же самое, как правильно убить потоки?) Заранее спс

      [Ответить]


    оставить комментарий или два