Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6   вперед  Ctrl      все
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Док
Member

Откуда: Казань
Сообщений: 7001
Fr0sT-Brutal
теперь хром плодит свои копии интенсивней, чем зерглинги вылупляются!

146%!
И на старых машинах иногда завешивает проц вусмерть.

roschinspb
Прогрессбар можно перерисовать и repaint-ом

если только в таймере. Интересно, сколько таймеров можно запустить без заметного вреда для софтины?

Сообщение было отредактировано: 7 авг 20, 08:30
7 авг 20, 08:32    [22178915]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
cptngrb
Member

Откуда:
Сообщений: 679
мне кажется эта статья описывает многопоточность достаточно хорошо, многое оттуда взять можно [url=]https://forum.vingrad.ru/topic-60076.html[/url]
7 авг 20, 08:45    [22178921]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
cptngrb
мне кажется эта статья описывает многопоточность достаточно хорошо, многое оттуда взять можно [url=]https://forum.vingrad.ru/topic-60076.html[/url]


Да, я с нею знакомился. Она не для начинающих. Писалась в те времена, когда программирование было уделом гениев. Очень тяжело усваивается. Думаю, мало кто осилит дочитать более 30% (до БАБ врядли дело дойдет :)
7 авг 20, 10:36    [22178972]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1299
Zelius
...
пришлось так делать когда использовал bass что бы писать интернет радио...
Если не секрет, какой протокол от сервера к клиенту? Какой-нибудь HLS или Icecast?
7 авг 20, 18:50    [22179383]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1641
Док
. Интересно, сколько таймеров можно запустить без заметного вреда для софтины?
много. В fix чуть менее чем у всех контролов есть анимация, а она содержит таймер.
9 авг 20, 04:16    [22179720]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Добавлен раздел планирование потоков
9 авг 20, 10:56    [22179749]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
ART-CODE
Member

Откуда:
Сообщений: 1092
Может пригодиться и такая инфа:

CAS
https://ru.wikipedia.org/wiki/Сравнение_с_обменом

FAA
https://en.wikipedia.org/wiki/Fetch-and-add
9 авг 20, 18:01    [22179855]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
ART-CODE
Member

Откуда:
Сообщений: 1092
spinlock
https://ru.wikipedia.org/wiki/Спин-блокировка

I/O Completion Ports
https://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports
------
Не всем, и не всегда нужна кроссплатформенность.
Бывает, что важнее выжать по-максимуму из возможностей ОС и процессора.
9 авг 20, 18:15    [22179858]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1542
s62,

Использовал чтото высокоуровневое, просто урл передавал, под капот потока не смотрел
9 авг 20, 21:11    [22179891]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Док,
зы. на скруле всегда так, как только тема исчерпывается, начинается оффтоп


Рано! Кучу материалов изучаю по многопоточности. Что-нибудь получится! :)
13 авг 20, 18:10    [22182112]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1299
DmSer
cptngrb
мне кажется эта статья описывает многопоточность достаточно хорошо, многое оттуда взять можно [url=]https://forum.vingrad.ru/topic-60076.html[/url]


Да, я с нею знакомился. Она не для начинающих. Писалась в те времена, когда программирование было уделом гениев. Очень тяжело усваивается. Думаю, мало кто осилит дочитать более 30% (до БАБ врядли дело дойдет :)

На мой взгляд неплохо или просто хорошо :) написано у Пачеко и Тексейры https://www.for-stydents.ru/informatika/delphi/uchebniki/delphi-5-rukovodstvo-razrabotchika-tom-1-osnovnye-metody-i-tehnologii-programmirovaniya.html Хотя книжка старая, 2000 года.
Глава 11 "Создание многопоточных приложений". По-моему довольно простое, понятное изложение, при этом затронуты разные темы, в том числе многопоточный доступ к БД, графика.

Сообщение было отредактировано: 14 авг 20, 13:31
14 авг 20, 13:31    [22182540]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Переработан раздел Планирование потоков

Пришлось убрать раздел "Роль кэшей процессора", т.к. выяснилось, что кэши процессора практически не играют никакой роли в планировании потоков и переключении контекста, а парить читателю мозги лишней информацией я не хочу.
Кто в теме разбирается, посмотрите на предмет того, чтобы не было дезинформации.
15 авг 20, 14:56    [22183011]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5091
DmSer,

warning Внимание! Согласно официальной документации, в секции threadvar нельзя объявлять переменные некоторых типов, в том числе: Pointer, Function, а также типы, работающие по принципу copy-on-write, например string.


Где это такие глупости написаны??? Официальная дока:
http://docwiki.embarcadero.com/RADStudio/Rio/en/Variables_(Delphi)#Thread-local_Variables
Thread-variable declarations:

cannot occur within a procedure or function.
cannot include initializations.
cannot specify the absolute directive.

Dynamic variables that are ordinarily managed by the compiler (long strings, wide strings, dynamic arrays, variants, and interfaces) can be declared with threadvar, but the compiler does not automatically free the heap-allocated memory created by each thread of execution. If you use these data types in thread variables, it is your responsibility to dispose of their memory from within the thread, before the thread terminates.
15 авг 20, 15:25    [22183020]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Kazantsev Alexey
DmSer,

warning Внимание! Согласно официальной документации, в секции threadvar нельзя объявлять переменные некоторых типов, в том числе: Pointer, Function, а также типы, работающие по принципу copy-on-write, например string.


Где это такие глупости написаны??? Официальная дока:
http://docwiki.embarcadero.com/RADStudio/Rio/en/Variables_(Delphi)#Thread-local_Variables
Thread-variable declarations:

cannot occur within a procedure or function.
cannot include initializations.
cannot specify the absolute directive.

Dynamic variables that are ordinarily managed by the compiler (long strings, wide strings, dynamic arrays, variants, and interfaces) can be declared with threadvar, but the compiler does not automatically free the heap-allocated memory created by each thread of execution. If you use these data types in thread variables, it is your responsibility to dispose of their memory from within the thread, before the thread terminates.


Я взял это несколько недель назад из их официальной документации, по той же ссылке. Видимо, уже успели поменять.

Сообщение было отредактировано: 15 авг 20, 16:31
15 авг 20, 16:32    [22183034]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5091
DmSer
Я взял это несколько недель назад из их официальной документации. Видимо, уже успели поменять.

Сходи по ссылке и посмотри дату последней модификации страницы.
15 авг 20, 16:37    [22183035]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5091
Дока от Delphi 2006:
Картинка с другого сайта.
15 авг 20, 16:44    [22183038]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Kazantsev Alexey,
Такой значит у них бардак в документации. Хорошо что заметили и поправили.
15 авг 20, 17:09    [22183052]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Измерил, как зависит количество запущенных потоков на производительность. Запускал 100000 потоков (64-битный компилятор), в каждом лишь такой код:

while not Terminated do 
  Sleep(30000)


Т.е. потоки тупо ничего не делают.

Измерял число операций на 4-х ядрах до запуска и после запуска этих потоков. Выяснилось, что падение производительности составляет 6%. Хотя я думал, что будет намного хуже.
Замеры делал с помощью "CalcTimeQuant.exe". Выяснилось, что 3 из 4-х ядер вообще не замечают этих спящих потоков и выдают максимальную производительность. Производительность падает грубо говоря только на одном ядре (видимо на нем и работает планировщик).
15 авг 20, 20:57    [22183121]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
DmSer
Kazantsev Alexey,
Такой значит у них бардак в документации. Хорошо что заметили и поправили.


Ошибся. Ссылка не та все-таки. Использовал эту ссылку
15 авг 20, 22:33    [22183150]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
DmSer
Переработан раздел Планирование потоков

Пришлось убрать раздел "Роль кэшей процессора", т.к. выяснилось, что кэши процессора практически не играют никакой роли в планировании потоков и переключении контекста, а парить читателю мозги лишней информацией я не хочу.
Кто в теме разбирается, посмотрите на предмет того, чтобы не было дезинформации.


Последний эксперимент дал новые идеи :)
Я ещё раз переработал этот раздел!
16 авг 20, 00:05    [22183179]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1299
DmSer,
автор
Я предполагаю, что логика обработки прерывания от системного таймера примерно такая:

системный таймер подаёт сигнал прерывания на все ядра процессора;
приостанавливается работа всех выполняемых потоков на всех ядрах процессора;
осуществляется запуск системного планировщика на одном из ядер процессора (Sheduler Core);

Руссинович и Соломон пишут вот тут https://www.microsoftpressstore.com/articles/article.aspx?p=2233328&seqNum=7 ,
автор
To make thread-scheduling decisions, the kernel maintains a set of data structures known collectively as the dispatcher database, illustrated in Figure 5-15. The dispatcher database keeps track of which threads are waiting to execute and which processors are executing which threads.

To improve scalability, including thread-dispatching concurrency, Windows multiprocessor systems have per-processor dispatcher ready queues, as illustrated in Figure 5-15. In this way each CPU can check its own ready queues for the next thread to run without having to lock the systemwide ready queues.
(Versions of Windows before Windows Server 2003 used a global database).

что, начиная с Windows server 2003 данные об очереди готовых к исполнению потоков у каждого процессора своя, так что они могут проверять каждый свою очередь, не блокируя очереди на уровне всей системы.

Сообщение было отредактировано: 16 авг 20, 12:37
16 авг 20, 12:38    [22183233]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
s62
DmSer,
автор
Я предполагаю, что логика обработки прерывания от системного таймера примерно такая:

системный таймер подаёт сигнал прерывания на все ядра процессора;
приостанавливается работа всех выполняемых потоков на всех ядрах процессора;
осуществляется запуск системного планировщика на одном из ядер процессора (Sheduler Core);

Руссинович и Соломон пишут вот тут https://www.microsoftpressstore.com/articles/article.aspx?p=2233328&seqNum=7 ,
автор
To make thread-scheduling decisions, the kernel maintains a set of data structures known collectively as the dispatcher database, illustrated in Figure 5-15. The dispatcher database keeps track of which threads are waiting to execute and which processors are executing which threads.

To improve scalability, including thread-dispatching concurrency, Windows multiprocessor systems have per-processor dispatcher ready queues, as illustrated in Figure 5-15. In this way each CPU can check its own ready queues for the next thread to run without having to lock the systemwide ready queues.
(Versions of Windows before Windows Server 2003 used a global database).

что, начиная с Windows server 2003 данные об очереди готовых к исполнению потоков у каждого процессора своя, так что они могут проверять каждый свою очередь, не блокируя очереди на уровне всей системы.


Классная статья! По ней убеждаюсь, что информация в моей статье в разделе "планирование потоков" более-менее корректная.
16 авг 20, 18:31    [22183285]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Bred eFeM
Member

Откуда:
Сообщений: 566
DmSer
Классная статья! По ней убеждаюсь, что информация в моей статье в разделе "планирование потоков" более-менее корректная.

Просто у этих ребят было добро на публикацию "инсайдерской" инфы от MыSы.

Вот ты её же по кусочкам раньше и насобирал.
17 авг 20, 00:54    [22183322]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
didgik
Member

Откуда:
Сообщений: 967
А я вот не понял п4.1
Зачем Sleep() обертывать в WaitTimeout ?
автор
warning Внимание! Если поток переведён в спящее состояние с помощью функции Sleep, то не существует другого способа выйти из этого состояния кроме истечения указанного временного периода.

И что тогда использовать вместо Sleep?
4 сен 20, 14:40    [22192161]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27063
didgik
И что тогда использовать вместо Sleep?

Например в WaitFor*Object, у которого в аргументах событие, которому можно посигналить извне.
4 сен 20, 15:24    [22192183]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6   вперед  Ctrl      все
Все форумы / Delphi Ответить