![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 04.11.2012
Сообщений: 151
|
![]()
Приветствую. Ребята, требуется помощь.
В потоках нуб, признаюсь. Пытаюсь синхронизировать потоки. Создаю потоки так: Код:
Сам код: Код:
Не обессудьте, с делфи мало работаю. Спасибо. Последний раз редактировалось _ZixeL_; 10.09.2015 в 00:29. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 31.05.2011
Сообщений: 301
|
![]()
Не уверен, что правильно, не тестил, но как-то так
![]() Код:
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 04.11.2012
Сообщений: 151
|
![]()
Спасибо большое за ответ. Но, к сожалению, проблема всё та же: начинается парсить не спервой страницы + первые 10 - повторы.
И потоки обрываются. Пропарсило 30 страниц и заглохло ![]() + Рассинхронизация. Ид страницы не соотвествует нику. Последний раз редактировалось _ZixeL_; 10.09.2015 в 02:06. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 31.05.2011
Сообщений: 301
|
![]()
Попробуй такой вариант)))
Код:
Код:
Последний раз редактировалось ДралсяСошибками; 10.09.2015 в 03:26. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 04.11.2012
Сообщений: 151
|
![]()
К сожалению, ничего не изменилось.
UPD. try...exept..end; помогло Вроде всё работает)) Спасибо огромное за помощь! Последний раз редактировалось _ZixeL_; 10.09.2015 в 03:32. |
![]() |
![]() |
![]() |
#6 | |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 178
|
![]() Цитата:
![]() сделали-бы лучше так: Код:
Последний раз редактировалось DIONISKA; 10.09.2015 в 03:57. |
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
Если важен порядок получения и потоки ДОЛЖНЫ будут исполняться в нужном порядке, то зачем потоки, Вполне достаточно цикла. Если НЕ важен порядок получения, НО ВАЖЕН порядок вывода, то НЕ НАДО пихать в поток то чему там В ЛЮБОМ случае не место(а именно вывод в мемo). Если его не будет, то не нужен будет ни syncronize, ни CriticalSection. (кстати Synchronize сам по себе УЖЕ CriticalSection) т.е. Код:
потоки должны получить данные и СПОКОЙНО ЖДАТЬ в завершенном(!) виде(FreeOnTreminate=FALSE!!!) пока их данные потребует главный поток( и что он с ними делать будет выводить в Мемо/сначала сортировать потов выводить ListBox/еще что-то не должно волновать поток) ПРИНЦИП разделяй и властвуй: при изменении способа вывода (memo|....) способ получения (ПОТОКИ) остаются НЕИЗМЕННЫМИ. чтобы узнать что поток завершил работу, у него есть event OnTerminate!!! Код:
читай комментарии и ПИШИ(хотя бы мысленно!!!) свои к своему коду. Ну и сам поток работающий без ВСЯКОЙ синхронизации Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 10.09.2015 в 10:58. |
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 04.11.2012
Сообщений: 151
|
![]()
Всё работает. Всем большое спасибо.
Только одна проблемка. В строке Код:
Так же пытался, в самом теле потока, вести статистику пропарсеных страниц ( что-то вроде: check:=check+1 ). Но так же к успеху не пришёл ![]() Есть какие-нибудь решения как вести статистику ( пропарсено, успешных страниц, страниц с ошибками)? Буду весьма признателен за наводку. Последний раз редактировалось _ZixeL_; 10.09.2015 в 17:55. |
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]()
Поток САМ по себе НИЧЕГО не суммирует, а только устанавливает СВОИ(твои) флажки(спарсено, нашли ошибку, завершено, ....)
(terminated это тот же флажок который можно использовать для определения завершения работы потока ). А всю статистику ВЕДЕТ основная программа. Для МОЕГО варианта. У тебя есть список потоков. В нем ты можешь КАЖДЫЙ раз при завершении потока (DoAfterLoad) пробегать по списку и СЧИТАТЬ любую статистику, используя ДАННЫЕ от потоков. (смотри Упорядоченный вывод результатов завершенных(!) потоков) Код:
Ну это как раз надо смотреть TNewThread.Execute поскольку ВСЕ действия потока(изменения его данных) (возможно кроме terminated) ВЫПОЛНЯТСЯ там. Цитата:
В этом случае до Pos (и соответствено ни до then ни до else ) дело может и не доходить. В дело вступает Exception. и сразу за ним treminate (потока)!! можно сделать так Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 10.09.2015 в 18:25. |
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 04.11.2012
Сообщений: 151
|
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Синхронизация потоков | Fireblade-fan | Общие вопросы Delphi | 5 | 17.12.2012 01:57 |
Синхронизация потоков | _Bers | Общие вопросы C/C++ | 5 | 23.12.2011 22:57 |
Синхронизация потоков | добрый_фей | Помощь студентам | 5 | 09.12.2011 19:57 |
Синхронизация потоков | alenka_ej | Помощь студентам | 0 | 03.06.2010 22:20 |