![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 26.04.2010
Сообщений: 105
|
![]()
Возникла необходимость создания мультипоточного приложения. Необходима одновременная работа до 10 потоков.
В данный момент пытаюсь ее делать так: Код:
Код:
При этом стоит вопрос, а не должен ли я их синхронизировать? Как? Насколько я понимаю процедуры с входными нельзя синхронизировать с помощью функции Synchronize. И вообще правильно ли я делаю. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
Начнём с того, что с VCL компонентами нельзя работать не из главного потока. Все эти обращения к Form1.CheckListBox1 и Form1.Memo2 рано или поздно завалят ваше приложение.
> potok.FreeOnTerminate:=true; есть шанс, что эта строчка выполнится уже после того, как поток отработает и завершится. > а не должен ли я их синхронизировать? зависит от того, что в них происходит. > входными нельзя синхронизировать с помощью функции Synchronize во-первых, Synchronize() ничего не "синхонизирует". Этот метод только обеспечивает выполнение переданной ему процедуры в главном потоке. во-вторых, параметры передавать можно, но не явно, а через поля класса, например. > И вообще правильно ли я делаю не заметно. 10 потоков будут насиловать одни и те же ini файлы. Смысл ваших действий?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#3 | |||
Форумчанин
Регистрация: 26.04.2010
Сообщений: 105
|
![]() Цитата:
Цитата:
Цитата:
Действительно только сейчас заметил, мне надо чтобы каждый новый потом брал следующий файл, только пока ума не приложу как это реализовать. |
|||
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> И как к ним тогда обращаться?
из потока лучше никак. Не, ну в самом деле, что там такого супер важного в этом мемо, чего нельзя передать в поток заранее? Если уж очень надо обратиться, то используйте Synchronize(), PostMessage() или любой другой доступный механизм межпотокового взаимодействия. > В них происходит отправка POST/GET запросов, парсинг. ну, это ни о чём не говорит. Скажем так, если в них идёт обращение к совместно разделяемым ресурсам (например, один парсер на всех, или один TStrignList, куда сбрасываются результаты парсинга), то оборачивайте доступ к ним критическими секциями, это и будет синхронизация, а не вызов Syncronize()! > А как насчет конкретного примера? специально не буду его приводить, т.к. смысл ваших потоков тогда свёдётся к тому, чтобы вызвать Synchronize() для той или иной процедуры. Все длительные действия должны проходить вне Synchronize(), иначе запускать отдельный поток бесмысленно, проще всё сделать в главном. > ума не приложу как это реализовать Ну это как раз просто: Код:
1) внутри потока не нужно больше обращаться к VCL, т.к. имя файла уже передано 2) FreeOnTerminate := True; выполняется в нужном месте 3) Проще выглядит создание потоков: Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 27.09.2010
Сообщений: 16
|
![]()
Читайте настройки ини в главном потоке и передавайте их параметром (как было замечено выше).
Моя реализация подобного Код:
Ну это так, отвлечение, заострить внимание я хотел не на этом. Проверьте как стартуют потоки, недавно в похожем случае выяснилось, что они стартанут разом после выполнения цикла. Вероятно у вас будет также. На 10 потоках вы этого не заметите, а вот 100 уложит вам машину. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание потоков | cargo29 | Общие вопросы Delphi | 16 | 07.08.2011 12:11 |
Создание большого количества потоков | Crystallon | Общие вопросы Delphi | 3 | 03.06.2011 02:42 |
Синхронизация потоков в С++ | erazer89 | Помощь студентам | 0 | 27.04.2010 20:14 |
создание потоков | MaRKer.nsk | Общие вопросы C/C++ | 6 | 28.03.2010 20:59 |
Перенаправление потоков | Carbon | Win Api | 5 | 25.11.2007 14:46 |