Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2012, 22:52   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Stilet
Ну почему же никак. Каждый поток сам считает, сколько ему захватить объектов на следующей итерации (это если разговор про статью).

То есть после обработки 1 объекта поток увеличивает свой счетчик захватываемых объектов, затем запоминает текущее состояние счетчика объектов (тот, который указывает на следующего для обработки) и сдвигает его на количество объектов, которое собирается обработать. Таким образом мы выделили небольшое количество объектов для обработки данным потоком.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.12.2012, 22:53   #12
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Аватар, BDA, эта идея то, что нужно. Как разграничить доступность объекта 2-м потокам и как вообще такое организовать? Где крит. секции вставлять?

Lardes,
вариант от Stilet'а выглядит примерно так:
Код:
for i:=1 to ThreadCount do
begin
  fEnd:=i*MsgPerThread-1;
  fStart:=fEnd-MsgPerThread+1;
end;
Делите без остатка кол-во объектов на кол-во потоков, получаете кол-во объектов на один поток. Затем делите тоже самое но уже с остатком, если остаток есть, то отдаете остаток к последнему потоку.
Человек_Борща вне форума Ответить с цитированием
Старый 26.12.2012, 23:00   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Человек_Борща, что-то такое:
Код:
uses SyncObjs.pas;
...
var
    Section: TCriticalSection;
    pos: integer;
...
//начало работы
   Section := TCriticalSection.Create;
   pos := 0;
   //запуск потоков
   Section.Free;
...
//в потоке
    Section.Enter;
    obj = pos;
    inc(pos);
    Section.Leave;
...
Слишком мало работал с потоками, так что компилируемость не гарантирую
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.12.2012, 23:03   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так стоп!
А такой проблемы как неравномерность данных для потоков быть не может?
Может лучше помечать элементы списка некой характеристикой-указателем, говорящей о том какому потоку нужно передавать элемент?
тогда и делить не надо будет.

Или так: Не важно как поделить, Первый поток захватывает один элемент, помечая его что он уже в деле, второй поток захватывает второй, так же его помечая. и так далее. Если какой-то из потоков заканчивает работу (справляясь раньше к примеру) он просто пробегаясь по списку берет первый попавшийся у которого пометка занятости отсутствует.
Тогда не надо делить на отрезки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2012, 23:07   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Stilet, все равно синхронизировать пометку нужно. Не проще ли держать текущий неиспользованный индекс и им манипулировать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.12.2012, 23:07   #16
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Lardes,
вариант от Stilet'а выглядит примерно так:
Код:
for i:=1 to ThreadCount do
begin
  fEnd:=i*MsgPerThread-1;
  fStart:=fEnd-MsgPerThread+1;
end;
Делите без остатка кол-во объектов на кол-во потоков, получаете кол-во объектов на один поток. Затем делите тоже самое но уже с остатком, если остаток есть, то отдаете остаток к последнему потоку.
Прошу прощения, MsgPerThread - это что? Само деление без остатка?
Lardes вне форума Ответить с цитированием
Старый 26.12.2012, 23:15   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Или так: Не важно как поделить, Первый поток захватывает один элемент, помечая его что он уже в деле, второй поток захватывает второй, так же его помечая. и так далее. Если какой-то из потоков заканчивает работу (справляясь раньше к примеру) он просто пробегаясь по списку берет первый попавшийся у которого пометка занятости отсутствует.
Тогда не надо делить на отрезки.
Мы с Вами говорим об одном и том же.
Что текущий индекс, что пометка - один хр... редиска.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.12.2012, 00:02   #18
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Прошу прощения, MsgPerThread - это что?
кол-во данных на 1 поток. ТО что кодом, то реализация совета от стилета.
То что после него, мой вариант из первого поста по скрину.
Есть 2 экземпляра класса TMyClass, 1 пустой, второй с заполненными полями.
Как из заполненного можно перенести все данные в пустой класс?
Человек_Борща вне форума Ответить с цитированием
Старый 27.12.2012, 00:03   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Мы с Вами говорим об одном и том же.
Та я ж и не спорю. Думаю если автор подробнее тему раскроет все станет на свои места.
Цитата:
синхронизировать пометку нужно.
Ну да. Тут уж не избежать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.12.2012, 00:09   #20
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Человек_Борща, благодарю! Разобрался
Lardes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tlist AngryD Помощь студентам 2 24.02.2012 12:22
Не открывая txt порезать его на читабельные куски. Человек_Борща Общие вопросы Delphi 5 03.01.2011 18:06
Порезать строчку KoBRaAndrey Общие вопросы Delphi 3 30.04.2010 11:27
Кусочки акуст. концерта HellMercenariess Свободное общение 0 05.10.2009 13:58
Подкорректирова tList Altera Общие вопросы Delphi 2 11.09.2009 20:24