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

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

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

Сritical section

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Сообщения
1,151
Симпатии
222
Баллы
155
VK
They work as follows: inside the critical section can only run one thread, while others are waiting for it to complete. To better understand all comparisons are made with a narrow tube, imagine, on the one hand the "crowd" flows, but the pipe can "climb" the only one, and when he "get through" - starts the movement of the second, and so in order. Even easier to understand this with an example, and the same ProgressBar'om. So, start one of the examples above. Click on the button, wait a few seconds and then press it again. What happens? ProgressBar started jumping. Jumping because we employ more than one stream, but two, and each of them conveys different meanings progress. Now a little remake code in onCreate event forms will create a critical
Работают они следующим образом: внутри критической секции может работать только один поток, другие ждут его завершения. Чтобы лучше понять, везде приводят сравнение с узкой трубой: представьте, с одной стороны "толпятся" потоки, но в трубу может "пролезть" только один, а когда он "пролезет" - начнёт движение второй, и так по порядку. Еще проще понять это на примере и тем же ProgressBar'ом. Итак, запустите один из примеров, приведённых ранее. Нажмите на кнопку, подождите несколько секунд, а затем нажмите еще раз. Что происходит? ProgressBar начал прыгать. Прыгает потому, что у нас работает не один поток, а два, и каждый из них передаёт разные значения прогресса. Теперь немного переделаем код, в событии onCreate формы создадим критическую секцию:
Код:
var
  Form1: TForm1;
  CriticalSection: TCriticalSection;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  CriticalSection:=TCriticalSection.Create;
end;
We have two TCriticalSection we need a method, Enter and Leave, respectively, in and out of her. We place our code in a critical section:
У TCriticalSection есть два нужных нам метода, Enter и Leave, соответственно вход и выход из неё. Поместим наш код в критическую секцию:
Код:
procedure TNewThread.Execute;
var
  i: integer;
begin
  CriticalSection.Enter;
  for i:=0 to 100 do
  begin
    sleep(50);
    SendMessage(Form1.Handle,PROGRESS_POS,0,i);
  end;
  CriticalSection.Leave;
end;
Try to run the application and press the button several times, and then count how many times will pass progress. Clearly, what is the essence? The first time you press the button, we create a stream, it takes a critical section and begins to work. Push the second - the second thread is created, but the critical section is busy, and it waits until it frees first. Third, fourth - all will be only in the queue.

Critical sections are convenient to use when processing the same data (lists, arrays) different threads. By understanding how they work, you can always find a use for them.

In this small article do not cover all methods of synchronization, there are events (TEvent), as well as system objects such as mutexes (Mutex), semaphores (Semaphore), but they are more suitable for interaction between applications. The rest, as regards the use of class TThread, you can learn on their own, it's pretty HELP'e detail. The purpose of this article - to show beginners, it is not so difficult and scary thing to figure out which is which. And plenty of practice - most importantly experience!
Попробуйте запустить приложение и нажать несколько раз на кнопку, а потом посчитайте, сколько раз пройдёт прогресс. Понятно, в чем суть? Первый раз, нажимая на кнопку, мы создаём поток, он занимает критическую секцию и начинает работу. Нажимаем второй - создаётся второй поток, но критическая секция занята, и он ждёт, пока её не освободит первый. Третий, четвёртый - все пройдут только по-очереди.

Критические секции удобно использовать при обработке одних и тех же данных (списков, массивов) разными потоками. Поняв, как они работают, вы всегда найдёте им применение.

В этой небольшой статье рассмотрены не все способы синхронизации, есть еще события (TEvent), а так же объекты системы, такие как мьютексы (Mutex), семафоры (Semaphore), но они больше подходят для взаимодействия между приложениями. Остальное, что касается использования класса TThread, вы можете узнать самостоятельно, в help'е всё довольно подробно описано. Цель этой статьи - показать начинающим, что не всё так сложно и страшно, главное разобраться, что есть что. И побольше практики - самое главное опыт!
 
Вверх Снизу