![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Даёт. eXa, для решения твоей задачи возможны несколько подходов. Пару я опишу. После реализации протестируешь, который из них оптимальнее (лень оценивать сейчас). 1. - Для каждого потока выделяется диапазон строк из TStringList; - строки при создании потока копируются для обработки, на время копирования TStringList блокируется для доступа из других потоков средствами синхронизации - каждый поток обрабатывает свой список строк, затеп копирует обратно, на время копирования TStringList блокируется для доступа из других потоков средствами синхронизации 2. - Каждый поток обрабатывает строки из диапазона ПОСТРОЧНО. При этом исходный список блокируется на время копирования строки в поток, а затем обратно. Вот примерный код для первого метода:
-------------------- |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 3 Всего: 158 |
эк безапелляционно. распараллеливание даст прирост только в случае небольшого файла и очень ресурсоемкой обработки каждой строки. в "нашем" же случае, я больше чем уверен, что обработка простейшая, а тормоза получаются из-за загрузки довольно объемного файла в стринг-лист. так что гораздо быстрее получится, если просто читать файл построчно... |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
безапелляционно, потому что знание - сила. Ты упустил одну маленькую деталь - система может быть многопроцессорной. -------------------- |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 3 Всего: 158 |
не упустил. при простой обработке и большом объеме файла основные тормоза - операция чтения с диска: тут кол-во процессоров никакой роли не сыграет. а вот расходы на загрузку в стринг-грид(в основном) и создание тредов - очень даже. |
|||
|
||||
eXa |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.12.2006 Репутация: нет Всего: нет |
Спасиб +100 за помощь, поразбираюсь когда будет время, а в сабже я привёл только пример для примера потоков
![]() |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Размер файла не имеет значения. Пусть это 10Кб-файл или файл размером 10Гб. Важна реализация. Добавлено @ 15:24 Опять же. Диск диску рознь. При кэше размером в несколько мегабайт и быстрых современных дисках со скоростью в десятки Мб/сек скорость обработки данных очень даже будет иметь значение. Это сообщение отредактировал(а) Демо - 24.7.2007, 15:25 -------------------- |
|||
|
||||
eXa |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.12.2006 Репутация: нет Всего: нет |
А вот что делать, если на форме есть TEdit который используеться в потоки, если TEdit находится в class(TForm) то поток его не видит Undeclared identifier: 'Edit1' а в class(TThread) тоже не поместишь...
|
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
eXa,
1. Для использования VCL из отдельного потока в основном необходимо применять метод Synchronize; 2. При создании потока в конструктор можно передать ссылку на твой TEdit и использовать ее;
А дальше используешь просто как FEdit.Text, например. -------------------- |
|||
|
||||
aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 7 Всего: 38 |
Ай-ай!!! Это что-же, правила работы с потоками не для всех пишуться???? А если ты будешь этот эдит будет использоваться в нескольких потоках???? В корне неверный совет!!! -------------------- ![]() |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
См. предыдущий пост. Читай внимательнее, пожалуйста, прежде чем замечания делать. -------------------- |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 1 Всего: 121 |
В случае, когда в системе один процессор/ядро оптимальное число потоков, для задачи, где НЕТ БЛОКИРУЮЩИХ ОПЕРАЦИЙ, 1 штука. Увеличение потоков даст прирост в случае, если в системе параллельно активно работают ещё несколько потоков(с таким же приоритетом). Но в этом случае будет лучше повысить потоку приоритет, нежели распараллеливать задачу.
PS Одному из участников форума я доказывал справедливость моих слов по ПМ, с примерами и теоретическим обоснованием, он тоже был удивлён. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Обоснования в студию ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
W4FhLF |
|
||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 1 Всего: 121 |
Alexeis, ещё раз перечитай моё сообщение. Обязательны 3 условия:
1. Одно ядро/процессор. 2. Отсутствие блокирующих операций. 3. Отсутствие активно расходующих процессорное время параллельных потоков других приложения, с тем же приоритетом(почти у любого из нас система работает в этом режиме практически постоянно). Сейчас будут обоснования. Добавлено @ 17:10
Что делает процедура ThreadProc можешь не вникать, суть в том, что там написан цикл, на ассемблере, с числом иттераций FFFFFFFF(4294967295). Наилучшее время выполнения: 56.766 сек. Далее запускаю такой пример:
Как видишь, два потока, в каждом будет выполняться цикл с числом иттераций 7FFFFFFF(2147483647), в общей сложности два потока выполнят 7FFFFFFF*2 = FFFFFFFE иттераций. Измерил и получил наилучшее время выполнения 56.046 сек. Учитывая, что код обоих потоков сжох? можно предположить, что они хорошо закешированы и поэтому выполняются так же быстро. Так же не учитывается погрешность с которой измеряет время GetTickCount, она составляет ~60 мс. Программы запускал по 5 раз каждую, в качестве результат брал наименьшее значение, т.к. оно является самым верным(не среднее). Счастливым обладателым n-ядерных процессоров предлагаю прочесть справку по SetThreadAffinityMask и, грамотно распараллелив потоки, сделать замер. PS AMD Athlon AM2 3500+ Это сообщение отредактировал(а) W4FhLF - 26.7.2007, 17:12 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Ааа сори, не нужно, все и так понятно, вот только условие "НЕТ БЛОКИРУЮЩИХ ОПЕРАЦИЙ" - почти утопия. В компе много устройств и работают они не всегда достачно быстро чтобы обеспечить друг друга данными, из-за чего обычно процессор не используется на 100%, так что если грамотно раскидать на потоки операции, то прирост будет.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
На самом деле в общем случае совершенно необязательно назначать потокам конкретные процессоры, так как это в большинстве случаев может привести лишь к снижению производительности. При ограничении использования некоторым потоком процессоров возможна ситуация, когда этот поток долгое время будет спать, ожидая, пока освободятся разрешенные процессора, в то время как другие процессоры будут простаивать. Система сама достаточно эффективно планирует распределение процессоров. Добавлено через 1 минуту и 12 секунд Почти вырожденный случай. -------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |