Delphi Studio » Delphi Статьи » Многопоточность в Delphi

    "Уважаемые посетители, если вы хотите задать вопросы и получить ответы, то регистрируйтесь и добавляйте свои вопросы тут: " Задать вопрос.
      Delphi Studio Многопоточность в Delphi
      FeniXElite | 13-08-2010, 23:51 | Delphi Статьи

      Многопоточность в Delphi


      Чаще всего, юзер начинает изучать потоки, когда задает вопрос: "Как сделать, чтобы форма не зависала?". И ему сразу же отвечают: "Многопоточность".

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

      Как написать многопоточное приложение в Delphi? - очень просто, и я постараюсь вам это продемонстрировать. Но для начала немного теории.

      Для начала давайте разберемся, что такое поток.

      Поток - объект внутри процесса, отвечающий за выполнение кода и получающий для этого процессорное время. Каждая программа представляет собой главный поток и несколько вспомогательных(причем вспомогательных может и не быть). При запуске программы создается поток для ее выполнения, и если приложение однопоточное, то весь код будет выполняться последовательно, учитывая все условные и безусловные переходы. И тут то и возникают проблемы(см. пример). Если в программе есть какие-либо длительные действия, то во время их выполнения мы будем наблюдать зависшую форму. Но решение есть, нужно создать еще один поток, который будет выполнятся параллельно с главным, т.е форма будет выполнятся в одном потоке(главном), а нужный код в другом(вспомогательном).

      Вот пример с тем же IdHTTP(Indy), когда многопоточность почти необходима:

      IdHTTP1.Get('xxx.ru'); // При выполнении этого кода можно заметить, что форма зависает.


      Многопоточность в Delphi обеспечивает почти параллельную(или по научному псевдопараллельно) работу множества программ. На самом деле настоящая параллельность возможна только на многопроцессорной машине. Но Windows, может имитировать такую работу.

      В Delphi работа с потоками реализуется с помощью класса TThread. Чтобы его использовать, достаточно унаследовать свой класс от него, и переопределить метод Execute.

      Думаю теории достаточно, чтобы вы имели представление о потоках. Перейдем к самому вкусному :) - к практике.

      Недавно постучали в асю, попросили объяснить работу с потоками и помочь написать небольшую программу. Суть ее была в следующем: "Получать исходные коды страниц из списка и сохранять их в файлы". Программа была написана, и она хороша тем, что на ее примере легко объяснить, как работать с потоками в Delphi.

      На чтоже, приступим :))

      Для работу с сетью я выбрал компонент IdHTTP из набора Indy(т.к многие с ним знакомы). Для хранения списка страниц будет использовать TStringList. Файлы с исходными кодами будем сохранять как name_of_site.txt.

      Открываем дельфи, создаем новое приложение. Для начала опишем свой класс потока, добавляем этот код после блока Uses :

      type
        TMyThread = class(TThread)
        private
          { Private declarations }
        protected
          procedure ThreadExit(Sender : TObject); // Код который будет выполнятся при завершении потока
          procedure Execute; override;
        public
          constructor Create; overload;
      end;


      Рассмотрим для начала конструктор:

      constructor TMyThread.Create;
      begin
         Create(True); // True означает, что после создания класса поток автоматически запущен не будет.
         FreeOnTerminate := True; // Указываем, что после завершения своего кода поток завершится сам, т.е не нужно вызывать метод Terminate
         OnTerminate := ThreadExit // При завершении вызывать процедуру ThreadExit
         Priority := tpNormal; // Устанавливаем приоритет
         Inc(alive); // Увеличиваем счетчик живых потоков(пригодится, когда потоков будет больше 1)
         Resume; // Запускаем поток(т.е вызываем метот Execute)
      end;


      Далее ThreadExit:

      procedure TMyThread.ThreadExit(Sender: TObject);
      begin
        Dec(alive);
      end;


      Теперь процедуру Execute, в которой находится основной код потока.

        
      procedure TMyThread.Execute;
      begin
      { Тут будет основной код   }
      end;


      С методами потока разобрались. Теперь, чтобы реализовать многопоточность, добавим к глобальным переменным :
      var
         MyThread : TMyThread;
         alive : integer; // Счетчик живых потоков
         codes : Integer; // Кол-во полученных исходников
         SiteList : TStringList; // Список сайтов

      Далее как и любой класс TMyThread нужно создать :
      MyThread := TMyThread.Create; // будет вызван конструктор Create


      Список сайтов можно загрузить как из мемо, так и из текстового файла, с помощью метода LoadFromFile.

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

      procedure TMyThread.Execute;
      var
        HTTP : TIdHTTP; // Важно создавать IdHTTP в потоке
        cur_site : string; // УРЛ текущего сайта
        Response : TStringList; // Исходный код страницы
      begin
      { Создаем объекты }
        Response := TStringList.Create;
        HTTP := TIdHTTP.Create(nil);
        HTTP.HandleRedirects := True;

      { Нам достаточно запустить один поток, в котором будет выполнятся след. цикл, а не запускать каждый раз новый, когда другой выполнит свой код }
        while (codes < SiteList.Count)and(Terminated = False) do // Пока кол-во полученных исходников меньше количества сайтов, и поток не остановлен, делать:
          begin
              cur_site := SiteList[codes]; // Получаем урл
              inc(codes); // Увеличиваем codes на 1

            try
              Response.Text := HTTP.Get(cur_site); // Тут делаем запрос
            except
              Continue;
            end;

            cur_site := StringReplace(cur_site, '.', '', [rfReplaceAll]); // Тут немного правим урл сайта, что бы можно было сохранить текстовик
            Delete(cur_site, 1, 7);
            Response.SaveToFile(cur_site + '.html'); // Сохраняем, можно в html, можно и в txt
          end; // while
      end;


      Вот собственно и весь код :)) Все очень просто, не правда ли?

      Теперь пара последних доработок :


      procedure TForm1.Button1Click(Sender: TObject);
      var
        i : Integer;
      begin
        SiteList.Text := Memo1.Lines.Text; // Загружаем список сайтов
        MyThread := TMyThread.Create; // Создаем поток

        Button1.Caption := 'Working...'; // Для наглядности :)))

      // Пока есть живой поток, выводим статистику
      repeat
            Label3.Caption := 'Alive: ' + IntToStr(alive);
            Label4.Caption := 'Codes: ' + IntToStr(codes);
            Application.ProcessMessages;
      until alive = 0;

        Button1.Caption := 'Finish';
        Label3.Caption := 'Alive: ' + IntToStr(alive);
      end;


      Поэкспериментируйте с данным кодом. Сделайте чтобы юзер сам выбирал кол-во потоков. Реализовать это можно так:
      Киньте на форму Edit. И измените свой код на:

      MyThread : array of TMyThread;
      ............
      SetLength(MyThread, StrToInt(Edit1.Text));

      for i := 0 to StrToInt(Edit.1Text) - 1 do
      MyThread[i] := TMyThread.Create;


      Правда тогда возникнут новые проблемы. А именно - проблемы с синхронизацией потоков. Но это уже материал след. статьи.
      Думаю теперь вы поняли, как создавать многопоточное приложение на Delphi.

      FeniXElite (c)
      При использовании статьи на сторонних ресурсах, ссылка на источник обязательна.
      • 85
       (голосов: 1)
      119 | 1
        #1

          • Delphin
            Администратор
            Рега: 12.04.2010
            Постов: 132
            Сообщений: 3
            858106
          Да, эта статья про многопоточность даже для новичков сойдёт smile
            14 августа 2010 10:54

            Информация
            Информация

              Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.

                Лучшее на Delphi Studio

                Лучшие книги по Delphi

                • Книга Delphi 2010 Handbook with Source Code
                  Книга Delphi 2010 Handbook with Source Code - Книга Delphi 2010 Handbook with Source Code посвящена CodeGear Delphi 2010
                • Книга Программирование в Delphi глазами хакера. Фленов
                  Книга Программирование в Delphi глазами хакера. Фленов - В книге вы найдете множество нестандартных приемов программирования на языке Delphi, его недокументированные функции и возможности. Вы узнаете, как создавать маленькие шуточные программы. Большая часть книги посвящена программированию сетей
                • Книга Delphi в шутку и всерьез что умеют хакеры М.Флёнов
                  Книга Delphi в шутку и всерьез что умеют хакеры М.Флёнов - Электронная книга о профессиональных приемах программирования в Delphi. В легкой и доступной форме с использованием большого количества профессиональных примеров рассмотрены вопросы корректного написания кода, оптимизации программ, работы с системным окружением, создания сетевых приложений
                • Книга Библия Delphi Михаил Фленов (2-е издание) + CD
                  Книга Библия Delphi Михаил Фленов (2-е издание) + CD - Книга посвящена программированию на языке Delphi от самых основ до примеров построения конкретных приложений. Подробно описывается логика выполнения каждого участка кода, чтобы читатель смог использовать эти знания при решении собственных задач. Книга содержит большое количество примеров практического программирования
                • Книга О чем не пишут в книгах по Delphi + CD Григорьев А.Б
                  Книга О чем не пишут в книгах по Delphi + CD Григорьев А.Б - Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP
                • Книга Delphi 7 Учебный курс С.Бобровский
                  Книга Delphi 7 Учебный курс С.Бобровский - Электронная книга является руководством по программированию в среде Delplii 7. Описывается весь процесс разработки программы: от конструирования диалогового окна до организации справочной системы и создания установочного CD-ROM
                • Книга Delphi Быстрый Старт
                  Книга Delphi Быстрый Старт - В книге описываются интерфейс системы визуального программирования Delphi на основе 6-й версии, состав и характеристика элементов проекта приложения, приемы программирования на языке Object Pascal
                • Книга Indy in Depth. Глубины Indy
                  Книга Indy in Depth. Глубины Indy - Книга Indy in Depth Глубины Indy будет интересно для тех, кто интересуется хакингом, вирусописанием, а значит и для тех, кто занимается защитой сетей, программ, информации. Эта книга не только по Indy, она про Интернет, про протоколы, термины, методы работы, а к Indy относятся только примеры
                • Книга OpenGL - Графика в проектах Delphi + CD. М.В.Краснов
                  Книга OpenGL - Графика в проектах Delphi + CD. М.В.Краснов - Книга посвящена использованию стандартной графической библиотеки OpenGL в проектах Delphi. Начиная с самой минимальной программы, последовательно и подробно рассматриваются все основные принципы программирования компьютерной графики: двухмерные итрехмерные построения, анимация, работа с текстурой, визуальные эффекты
                • Книга Delphi 7 для профессионалов. Марко Кэнту
                  Книга Delphi 7 для профессионалов. Марко Кэнту - Книга, которую должен прочитать каждый, кто хочет стать профессиональным программистом на Delphi. Книга не предназначена для начинающих. Требуются хорошие знания Delphi. Предназначена для тех, кто хочет стать именно профессиональным программистом

                Друзья сайта

                Лучшие программы скачать бесплатно для компьютера
                Программы


                Поиск на Delphi Studio




                На Delphi Studio нашли

                delphi компоненты для работы в трей delphi компоненты для работы в трей
                delphi свернуть в трей delphi свернуть в трей
                Delphi вывести случайное число Delphi вывести случайное число
                обновить indy обновить indy
                права доступа к файлам delphi права доступа к файлам delphi
                скачать учебник delphi 7 скачать учебник delphi 7
                как скопировать в tstringlist из memo как скопировать в tstringlist из memo
                StringReplace delphi2010 StringReplace delphi2010
                delphi как нажать кнопку Button delphi как нажать кнопку Button
                Как добавить прграмму в Total Commander Как добавить прграмму в Total Commander
                delphi stringgrid нажатие на заголовок delphi stringgrid нажатие на заголовок
                как на delphi свернуть программу в трей как на delphi свернуть программу в трей
                загрузить файл на ftp вудзрш загрузить файл на ftp вудзрш
                delphi компонент анимация gif delphi компонент анимация gif
                vcl, определить размер файла vcl, определить размер файла
                delphi как проверить существует ли фаил delphi как проверить существует ли фаил
                учебник delphi 2010 учебник delphi 2010
                как скопировать первые 10 знаков string delphi как скопировать первые 10 знаков string delphi
                icq база данных исходник icq база данных исходник
                скачать бесплатно исходники для delphi 7 скачать бесплатно исходники для delphi 7
                создать twebbrowser программно создать twebbrowser программно
                delphi bitblt jgbcfybt delphi bitblt jgbcfybt
                архангельский delphi 7 скачать архангельский delphi 7 скачать
                форму панель задач Delphi форму панель задач Delphi
                язык Delphe.net язык Delphe.net
                открыть форму дельфи открыть форму дельфи
                программно перезагрузить программно перезагрузить
                компонент CoolTrayIcon компонент CoolTrayIcon
                delphi скачать картинку delphi скачать картинку
                Delphi считать случайную строку из файла Delphi считать случайную строку из файла
                webbrowser delphi показать рисунок
webbrowser delphi показать рисунок
                opendialog delphi запуск файла
opendialog delphi запуск файла
                delphi текст в буфер обмена
delphi текст в буфер обмена
                функции на Delphi для компонента Timer
функции на Delphi для компонента Timer
                как поменять прозрачность окна delphi
как поменять прозрачность окна delphi
                отправка нажатием клавиши delphi
отправка нажатием клавиши delphi
                скочать игры PC бесплатно бес sms и регистраций
скочать игры PC бесплатно бес sms и регистраций


                Информация

                Сайт Delphi Studio рассчитан для начинающих, новичков, чайников, которые решили программировать на Delphi :)
                Добавляйте свои примеры, исходники, компоненты, статьи и тогда на сайте будет много полезной информации, что поможет друг другу находить нужный материал.


                Случайные новости

                Авторизация на mail.ru (IdHTTP) Пример на Delphi
                Авторизация на mail.ru (IdHTTP) Пример на Delphi - Пример авторизации в Delphi на сайте mail.ru. Для авторизации на сайте mail.ru нужно кинуть на форму компонент IdHTTP
                Книга Программирование в Delphi глазами хакера. Фленов
                Книга Программирование в Delphi глазами хакера. Фленов - В книге вы найдете множество нестандартных приемов программирования на языке Delphi, его недокументированные функции и возможности. Вы узнаете, как создавать маленькие шуточные программы. Большая часть книги посвящена программированию сетей
                Авторизация на сайте vkontakte.ru на сокетах (ClientSocket) Пример на Delphi
                Авторизация на сайте vkontakte.ru на сокетах (ClientSocket) Пример на Delphi - Пример авторизации на сайте vkontakte.ru на сокетах (Socket). На форму нужно добавить компонент ClientSocket, 2 Edit, Button


                Опрос

                Что вы хотите больше на Delphi Studio?
                Исходники
                Книги, Учебники
                Компоненты
                Статьи
                Примеры



                Информация

                А знаете ли вы что такие известные программы как AIMP, Skype, QIP, QIP Infium, R&Q, The Bat!, FL Studio, Guitar Pro, Game Maker, Total Commander, PowerArchiver, Download Master написаны на Delphi? И это далеко не весь список программ чем может похвастаться продукция Borland Delphi!


                rss