Что нового
  • Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

In a streaming DELPHI (РАБОТА С ПОТОКАМИ В DELPHI)

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,184
Баллы
155
Often seen on the forums opinion that the flows are not needed at all, any program can be written so that it will work fine without them. Of course, if you do not do anything serious "Hello World" this is the case, but if you gradually gain experience, sooner or later, any novice programmer rested into the possibility of a "flat" code, the need arises to parallelize tasks. Some problems can not be realized at all without the use of threads, such as working with sockets, COM-port, long wait any event, etc.

Everyone knows that Windows is a multitasking system. Simply put, this means that several programs can run while running. All we opened Task Manager and see a list of processes. Process - an instance of a running application. In fact, by itself it does nothing, it is created when the application starts, contains proprietary information, through which the system is working with him, so did he allocate the necessary memory for code and data. In order to make the program to work, it is created in the stream. Any process contains at least one thread, and it is responsible for the execution of code and obtains the CPU time. This is achieved and the imaginary parallel work programs, or as it is called, a pseudo. Why is imaginary? Yes, because the actual processor at any one time can carry only one piece of code. Windows distributes CPU time for all threads in the system at a time, thus the impression that they are working at the same time. Actually working in parallel streams can be only on machines with two or more processors.

To create additional threads in Delphi, there is a base class TThread, from it we will be inherited in the implementation of their streams. In order to create a "skeleton" of a new class, you can select the menu File - New - Thread Object, Delphi will create a new module with the workpiece in this class. I will describe it for clarity in the form module. As you can see, in this workpiece added one method - Execute. That's it we need to redefine the code inside it and will run in a separate thread. And so, let's write an example - run in an endless loop flow:

Не редко встречал на форумах мнения, что потоки не нужны вообще, любую программу можно написать так, что она будет замечательно работать и без них. Конечно, если не делать ничего серьёзней "Hello World" это так и есть, но если постепенно набирать опыт, рано или поздно любой начинающий программист упрётся в возможности "плоского" кода, возникнет необходимость распараллелить задачи. А некоторые задачи вообще нельзя реализовать без использования потоков, например работа с сокетами, COM-портом, длительное ожидание каких-либо событий, и т.д. Всем известно, что Windows система многозадачная. Попросту говоря, это означает, что несколько программ могут работать одновременно под управлением ОС. Все мы открывали диспетчер задач и видели список процессов. Процесс - это экземпляр выполняемого приложения. На самом деле сам по себе он ничего не выполняет, он создаётся при запуске приложения, содержит в себе служебную информацию, через которую система с ним работает, так же ему выделяется необходимая память под код и данные. Для того, чтобы программа заработала, в нём создаётся поток. Любой процесс содержит в себе хотя бы один поток, и именно он отвечает за выполнение кода и получает на это процессорное время. Этим и достигается мнимая параллельность работы программ, или, как её еще называют, псевдопараллельность. Почему мнимая? Да потому, что реально процессор в каждый момент времени может выполнять только один участок кода. Windows раздаёт процессорное время всем потокам в системе по очереди, тем самым создаётся впечатление, что они работают одновременно. Реально работающие параллельно потоки могут быть только на машинах с двумя и более процессорами. Для создания дополнительных потоков в Delphi существует базовый класс TThread, от него мы и будем наследоваться при реализации своих потоков. Для того, чтобы создать "скелет" нового класса, можно выбрать в меню File - New - Thread Object, Delphi создаст новый модуль с заготовкой этого класса. Я же для наглядности опишу его в модуле формы. Как видите, в этой заготовке добавлен один метод - Execute. Именно его нам и нужно переопределить, код внутри него и будет работать в отдельном потоке. И так, попробуем написать пример - запустим в потоке бесконечный цикл:
Код:
TNewThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TNewThread }

procedure TNewThread.Execute;
begin
  while true do {ничего не делаем};
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  NewThread: TNewThread;
begin
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;
end;
Run the example to perform and click. It seems nothing is happening - the form is not hung, reacts to movement. In fact it is not - open Task Manager and you will see that the CPU is loaded in full. Now in the process of your application running two threads - one was created initially, when the application starts. The second, which loads the CPU so - we have created at the touch of a button. So, let's see, what does the code in Button1Click:
Запустите пример на выполнение и нажмите кнопку. Вроде ничего не происходит - форма не зависла, реагирует на перемещения. На самом деле это не так - откройте диспетчер задач и вы увидите, что процессор загружен по-полной. Сейчас в процессе вашего приложения работает два потока - один был создан изначально, при запуске приложения. Второй, который так грузит процессор - мы создали по нажатию кнопки. Итак, давайте разберём, что же означает код в Button1Click
Код:
NewThread:=TNewThread.Create(true);
here we have created an instance of TNewThread. Create constructor has only one parameter - CreateSuspended type boolean, which indicates start a new thread immediately after the creation (if false), or wait for the command (if true).
тут мы создали экземпляр класса TNewThread. Конструктор Create имеет всего один параметр - CreateSuspended типа boolean, который указывает, запустить новый поток сразу после создания (если false), или дождаться команды (если true)

Код:
New.FreeOnTerminate := true;
FreeOnTerminate property determines that the stream after the end automatically, the object will be destroyed, and we do not have to destroy it manually. In our example, it does not matter, because by itself it will never end, but you will need the following examples.
Код:
NewThread.Priority:=tpLower;
Property Priority, if you have not already guessed from the name, sets the priority of the flow. Yes, yes, every thread in the system has its own priority. If the CPU time is not enough, the system begins to distribute it according to the priority of the thread. Priority property can take the following values:
tpTimeCritical - critical
tpHighest - very high
tpHigher - high
tpNormal - average
tpLower - low
tpLowest - very low
tpIdle - stream running during downtime
Put high priority of the thread is not necessary, unless required by the task, as it is very heavy system.

Свойство Priority, если вы еще не догадались из названия, устанавливает приоритет потока. Да да, каждый поток в системе имеет свой приоритет. Если процессорного времени не хватает, система начинает распределять его согласно приоритетам потоков. Свойство Priority может принимать следующие значения:
tpTimeCritical - критический
tpHighest - очень высокий
tpHigher - высокий
tpNormal - средний
tpLower - низкий
tpLowest - очень низкий
tpIdle - поток работает во время простоя системы Ставить высокие приоритеты потокам не стоит, если этого не требует задача, так как это сильно нагружает систему.

Код:
NewThread.Resume;
Well, actually, starting a thread

I think now you understand how to create threads. Note, nothing complicated. But it is not so simple. It would seem - write any code inside the Execute method and all, but no, streams have one unpleasant property - they do not know anything about each other. And what of it? - You may ask. Here's what: let's say you're trying to change the flow of other property of any component on the form. As you know, VCL single-threaded, all code within the application is executed sequentially. For example, in the process of change some data within classes VCL, the system selects the time, the main stream passes on a circle other flows and returns back, with code execution continues from the point where a halt. If we are out of their flow change something, for example, to form activated many mechanisms within the VCL (I remind you of the basic flow until the "suspended"), respectively, during this time will have time to change any data. Suddenly time again given to the main stream, he calmly continues its execution, but the data has changed! For what it may lead - you can not predict. You can check it a thousand times, and nothing happens, and the program will crash the first thousand. And this applies not only to interact more with the main flow, but also the interaction between streams. Write such programs certainly can not be sloppy.
Думаю, теперь вам понятно, как создаются потоки. Заметьте, ничего сложного. Но не всё так просто. Казалось бы - пишем любой код внутри метода Execute и всё, а нет, потоки имеют одно неприятное свойство - они ничего не знают друг о друге. И что такого? - спросите вы. А вот что: допустим, вы пытаетесь из другого потока изменить свойство какого-нибудь компонента на форме. Как известно, VCL однопоточна, весь код внутри приложения выполняется последовательно. Допустим, в процессе работы изменились какие-то данные внутри классов VCL, система отбирает время у основного потока, передаёт по кругу остальным потокам и возвращает обратно, при этом выполнение кода продолжается с того места, где приостановилось. Если мы из своего потока что-то меняем, к примеру, на форме, задействуется много механизмов внутри VCL (напомню, выполнение основного потока пока "приостановлено"), соответственно за это время успеют измениться какие-либо данные. И тут вдруг время снова отдаётся основному потоку, он спокойно продолжает своё выполнение, но данные уже изменены! К чему это может привести - предугадать нельзя. Вы можете проверить это тысячу раз, и ничего не произойдёт, а на тысяча первый программа рухнет. И это относится не только к взаимодействию дополнительных потоков с главным, но и к взаимодействию потоков между собой. Писать такие ненадёжные программы конечно нельзя.
help
 
Последнее редактирование:

SsSsSr

Registred
Новичок
Регистрация
23 Сен 2015
Сообщения
11
Баллы
30
Возраст
38
IdThreadComponent - использует ктонить вообще? теже потоки только проще все чуток
 
Вверх