![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| eXa |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.12.2006 Репутация: нет Всего: нет |
Драсти!
Есть цикл, каторый построчно перебирает значения из текстового файла, требуется распараллелить этот цикл на заданное количество потоков, для ускарения процесса. Сколько про потки мне не объясняли и сколько я про них нечитал, всё равно не пойму как это сделать, приветствуется пример!
Это сообщение отредактировал(а) eXa - 19.7.2007, 05:35 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
уууу дарагой!
пачитай умную книжку, да?! если ничего нипаймешь, значит праграммиравание нитвае! з.ы. а еще сначала русский язык подучи. а то 2 ошибки в заголовке темы очень уж глаза режут. Это сообщение отредактировал(а) MetalFan - 19.7.2007, 06:06 -------------------- There are always someone smarter than you... |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 1 Всего: 121 |
Распараллеливание в данном случае прироста к скорости не даст.
Это сообщение отредактировал(а) W4FhLF - 19.7.2007, 07:32 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
eXa, специально для таких случаев добрый дядя Петрович написал неплохую обучающую статейку для освоения главных принципов работы с потоками http://forum.vingrad.ru/index.php?show_typ...howtopic=163841
И перевел целую книжку http://forum.vingrad.ru/index.php?show_typ...showtopic=60076 Это сообщение отредактировал(а) Alexeis - 19.7.2007, 09:31 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| eXa |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.12.2006 Репутация: нет Всего: нет |
Маё, маё, но вот патоки мне даюца труднавато... ps. а тут форум литературного кружка разве, на ошипки так реагировать? O_o
Петрович круче всех конешно и за перевод ему 100 плюсов, но 95% информации каторой там есть мне просто не нужно, да и на практике я лучше как то понимаю, если ковот не затруднит выложите исходничик, в катором можно задавать кол-во потоков Это сообщение отредактировал(а) eXa - 19.7.2007, 12:34 |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Изучение потоков не похоже на изучение нового компонента и класса. Это обширная тема. К теме потоков по-быстрому просто невозможно подойти. В этом случае лучше вообще не браться. Это как раз тот случай когда на примере нельзя разобраться и нужно очень хорошо знать теорию. Чтобы было понятно, приведу такой пример. Просьба напоминает просьбу следующего содержания. Начинающий сапер спрашивает у опытного - покажи как как мне вот эту мину разминировать, а все остальные я как-нибудь сам придумаю как разминировать. Вот ты как раз тот начинающий сапер, который рвется на разминирование, так что мы тебя не зря не пускаем, так как многопоточность - это минное поле, причем там мины разных конструкций. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
во загнул) -------------------- There are always someone smarter than you... |
|||
|
||||
| aktuba |
|
||||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 7 Всего: 38 |
То, что дается трудно, видно по знанию русского языка. Попробуй сначала его поучить, прежде чем за другое браться. Если уж не можешь общаться на русском, как ты собираешься программы писать, где знание и соблюдение правил намного важнее!
Странная точка зрения. Представь - едешь на машине и знаешь только как руль крутить. Далеко уедешь? А как-же педали, коробка передач??? Про поворотники, фары, сигнал и многое другое - вообще лучше не упоминать. Да и про сапера пример отличный. Так что
явно не верно! Не твое это, если и за своей речью следить не можешь и программирование пытаешься по кусочкам изучать... -------------------- ![]() |
||||||
|
|||||||
| eXa |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.12.2006 Репутация: нет Всего: нет |
Мне это напоминает бабулек около подъезда, с богатым жизненым опытом... Да во многом вы правы, но нинад подстраивать всё под себя, есть много методов обучения тому то и тому то, да и вообще бывают исключения даже у сапёров
aktuba я тебя не понимать! Как можно приравнивать язык на катором разговариваеш с программированием, это тоже самое как прировнять его к физике или математике. Cкажи это Энштейну, каторому в школе язык ну никак не давался! Да и вообще это форум, у многих свои привычки общения в нём, не забывай этого, и пожалуст нинад так критично в чём то поучать, это же самое настоящие лицемерие! Ну если исходник никто мне дать ненамерен(я уже большего не прошу), то тему можно закрыть! Дальше ток оффтоп может быть, можно во флейм перекинуть там и поспорим, если интерестно :P Это сообщение отредактировал(а) eXa - 19.7.2007, 18:41 |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 4 Всего: 146 |
имхо нормальное высказывание своих мыслей на нормальном (более или менее ) языке ускоряет получение ожидаемого ответа, так что решать Вам.... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| aktuba |
|
||||||||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 7 Всего: 38 |
А никто под себя не подстраивает. Просто есть общие правила общения, которые надо стараться соблюдать. Так, например, если я буду отвечать на татарском - ты врядли захочешь общаться, верно? Так что будь добр, соблюдай правила хорошего общения, когда общаешься с другими.
Очень жаль.
А учебники по физике или математике как написыны? Твоим стилем или общеразговорным? И как тебе будет более понятно и приятно читать книги, которые будут написаны твоим стилем???
Вот именно!!! И надо уважать мнения других! Не я один тебе уже сделал замечание, а ты все по своему... Лицемерие - это не обращать внимание на других, т.е. в данном случае - это больше подходит тебе. Подумай над этим.
На форуме не будут за тебя решать задачу. Только помогут, но не более. Тем более, что тебе уже ответили - данный подход не поможет. А учитывая, что ты не обращаешь внимания ни на критику, ни на советы хорошие - вряд ли кто-то захочет тебе помочь... -------------------- ![]() |
||||||||||
|
|||||||||||
| Elerond |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 184 Регистрация: 18.6.2007 Репутация: нет Всего: 3 |
Книги читай... есть такие как раз для новичков. Если надо могу сказать какая. Там и про потоки есть.
--------------------
Мой блог |
|||
|
||||
| eXa |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.12.2006 Репутация: нет Всего: нет |
Ребята это вы уже совсем про другое.. У меня же не свой язык общения или какой то сленг, а просто сокращения типа "ться" заменить на "ц" и само сабой есть какие то неумешленные ошибки каторые общий смысл предложения не меняют, причём хочу заметить что мозг воспринимает только первую и последнию букву в слове, а порядок между ними особова значения не имеет(если интересно гугл в помощь), да и учебники я писать не собираюсь, во всяком случии пока
А терь по теме! В этом случии я создаю 5 потоков?
Это сообщение отредактировал(а) eXa - 23.7.2007, 04:20 |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 7 Всего: 38 |
Вот! Можешь же, когда хочешь А по теме - нет, ты создаешь только один поток... -------------------- ![]() |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Нужно вот это
в цикле вызывать, чтобы создать несколько потоков. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 секунд Почти вырожденный случай. -------------------- |
|||
|
||||
| eXa |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.12.2006 Репутация: нет Всего: нет |
Удалось передать VCL первым методом...
Возникают вопросы... 1. Можно передать TMemo без дополнительной процедуры и без конструктора? 2. Если я создаю больше одного потока, как будет вести себя код? Это сообщение отредактировал(а) eXa - 28.7.2007, 06:20 |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
1. вопрос непонятен. куда передать? какой конструктор?
2. если код написан правильно, то программа будет себя вести хорошо) з.ы. нафиг критическую секцию припаял? у тебя и так код в Synchronize в основном потоке будет работать -------------------- There are always someone smarter than you... |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
eXa,
В моём примере критическую секцию надо убрать и использовать только Synchronize, так как обновляется VCL-компонент. -------------------- |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |