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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 20:58   #1
niva622
Форумчанин
 
Регистрация: 31.12.2006
Сообщений: 114
По умолчанию

Здравствуйте, пытаюсь разобраться в многопоточности, есть задача: На форме лист бокс по нажатию на кнопку, лист бокс начинает заполняться по порядку от 1 до 1000000, как осуществить заполнение в несколько потоков, без повторения цифр...

Суть я понимаю, только при повторном нажатии по кнопке, цикл начинает выполняться заного, тем самым повторяются цифры, прошу даже не код, а совет как это можно осуществить...

Последний раз редактировалось Stilet; 21.05.2013 в 21:29.
niva622 вне форума Ответить с цитированием
Старый 21.05.2013, 21:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Установи свойство для каждого потока: Число, с которого поток начинает свой отсчет. В цикле к этому числу прибавляется 1, потом в синхронизированной процедуре-методе потока (если имеется ввиду TThread) выводится в ЛистоБокс.
Таким образом скажем будет 10 потоков. Первый поток будет стартовать с 1, второй с 1000000 div 10, третий с 1000000 div 100, и т.д.
Тогда исключатся повторы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2013, 21:50   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

niva622, очень сомневаюсь, что в 10 потоков будет сильно быстрей ListBox заполняться, чем просто в основном потоке. Если вообще быстрей будет. Не забывай синхронизировать вывод в ListBox
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.05.2013, 03:39   #4
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию

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

Последний раз редактировалось iworm2009; 22.05.2013 в 03:47.
iworm2009 вне форума Ответить с цитированием
Старый 22.05.2013, 04:29   #5
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Цитата:
Сообщение от iworm2009 Посмотреть сообщение
если не изменяет память...
У меня для вас плохие новости
Delphi_ProGer вне форума Ответить с цитированием
Старый 22.05.2013, 05:24   #6
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию

да закусывать надо

Последний раз редактировалось iworm2009; 22.05.2013 в 05:32.
iworm2009 вне форума Ответить с цитированием
Старый 22.05.2013, 08:17   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
да закусывать надо
И синхронизировать )
Беды конечно не должно быть, но минимум получишь цифры в разброс без синхронизации.
Цитата:
сомневаюсь, что в 10 потоков будет сильно быстрей ListBox заполняться, чем просто в основном потоке.
Ну если это учебная задача то побезобразничать мона
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2013, 10:08   #8
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

простейшая многопоточность без заморочек это таймер, следовательно 3 таймера это 3 потока (где то читал что старить таймер менее чем на 24 мс нет смысла из за особенностей дельфи 7, может потом подправили), и сделать одну глобальную переменную тогда будут веселее цифры идти. запускать все таймеры нужно при нажатии одной кнопки. так же для ускорения можно сделать мелкие циклы в таймерах.
например проверить можно таймеры так
первый таймер прибавляет 1 к глобальной переменной
второй 100, третий 1000. и всё это в соответствующих событиях таймеров. с единственным условием что глобальная переменная должна быть менее чем предел. код наверное не надо писать мне и так там 1-2 строчки.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 22.05.2013, 11:36   #9
niva622
Форумчанин
 
Регистрация: 31.12.2006
Сообщений: 114
По умолчанию

неее, дело в том что задача не учебная) просто самостоятельно начал изучать потоки, где то читал что синхронизацию необходимо использовать только для вывода информации...
Зы.. Таймером можно, но задача стоит не та, пока вижу вариант синхронизировать несколько потоков, только задача.. А если потоков нужно 20-50 все через синхронизацию ?!
niva622 вне форума Ответить с цитированием
Старый 22.05.2013, 11:49   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
читал что синхронизацию необходимо использовать только для вывода информации
листбокс и есть вывод
Цитата:
А если потоков нужно 20-50 все через синхронизацию ?!
смотря что делать, если поток делает сам себе - нет, если надо взаимодействие, то только так.
eval вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
многопоточность blacktener Общие вопросы по Java, Java SE, Kotlin 1 25.07.2012 13:18
Многопоточность t2skler Общие вопросы C/C++ 4 16.04.2012 14:24
Многопоточность WennY Общие вопросы Delphi 11 23.04.2011 00:46
многопоточность DeDoK Общие вопросы Delphi 6 01.08.2010 02:14