| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Некоректно работает многопоточность |
| Автор: UKRtortik 15.5.2014, 14:04 | ||
Все Добрый День!
Почему то обрабатывает не все ссылки, и если поставить например 20 потоков то вообще начинает пропускать половина ссылок. В чем тут может быть проблема? |
| Автор: Poseidon 15.5.2014, 15:04 |
| Acc - это что? Глобальная переменная? Еще к ней кто-то имеет доступ на изменение? PS. А в чем вообще смысл метода TNewThread.Create? |
| Автор: Illusion Dolphin 15.5.2014, 16:45 | ||||||
1)
Нельзя обращаться к элементам формы напрямую 2)
Не нужно использовать общие переменные в этом месте 3) Парные вещи делают через
4) Нужно форматировать код |
| Автор: PointerToNil 16.5.2014, 10:00 |
| UKRtortik, ну почему ты весь код сразу не показываешь? воображать и гадать приходится... вот как у тебя критическая секция инициализируется??? (есть догадки, что неправильно) может, у тебя у каждого потока своя CS - вот было бы круто: "я в свою критическую секцию вошел, а ваши меня ниипут" |
| Автор: PointerToNil 16.5.2014, 11:41 | ||||
кстати,
можно заменить на
я бы попробовал |
| Автор: UKRtortik 16.5.2014, 12:12 | ||||
Вот полный код:
|
| Автор: PointerToNil 16.5.2014, 12:52 |
| var Work:boolean должен быть локальнойпеременной в procedure TNewThread.Execute и на всякий случай: 1) InterlockedDecrement(Thread) вместо dec(Thread) 2) Potok[Thread]:=TNewThread.Create(false); (или что там у тебя должно быть в Potok? там останется только последний из) |
| Автор: Illusion Dolphin 16.5.2014, 19:32 | ||
Это общий ресурс, а вы в каждом потоке его используете. Это должен быть локальные объект в потоке. |
| Автор: UKRtortik 17.5.2014, 21:20 | ||
Переписал код. Соровно не коректо не много работает:
У кого еще какие предложения будут? |
| Автор: b8195108 17.5.2014, 22:24 |
Купить и почитать 2 книги: 1. Русский язык. 2. Delphi для начинающих. |
| Автор: UKRtortik 17.5.2014, 22:42 |
| что не так? |
| Автор: Illusion Dolphin 18.5.2014, 10:31 | ||||
1) Общие ресурсы r, html 2) Нельзя обращаться к элементам формы напрямую 3) Оформлеие кода
Ашыпка навена дета |
| Автор: PointerToNil 18.5.2014, 12:40 |
| UKRtortik, указания игнорируете и ждете других? непонятно, на что надеетесь Work должен быть локальной переменной в Execute - непонятно написал? в других местах замените "if Work = True" на "if Acc < Proxy.Count" UKRtortik> что не так? это вы нам скажите, что у вас не так! что-то где-то "не коректо не много работает" - мы-то как можем догадаться, что именно там у вас некорректно??? P.S. зачем по SpeedButton2 ставить на паузу один поток (последний из созданных) - для меня загадка P.S.2 навставляйте во все ключевые места Execute вывод в ваше мемо строк с текстом о текущей стадии процесса со значениями ключевых переменных (ThreadId, Num, ...) - это называется debug log (чтобы не изобретать передачу параметра через synchronize и не загромождать ваше Memo лишним, можно выводить лог винапишным OutputDebugMessage и просматривать через View | Debug Windows | Event Log (или утилитку DebugView от sysinternals) или добавить в любой модуль {$APPTYPE CONSOLE} и выводить лог в окно консоли простыми WriteLn'ами |
| Автор: UKRtortik 29.5.2014, 13:46 | ||
А как тогда останавливать поток буду? |
| Автор: Poseidon 29.5.2014, 14:45 |
Через переменную потока. В твоем случае эта переменная будет типа TNewThread. |
| Автор: UKRtortik 8.6.2014, 22:08 | ||
| А почему Work должен быть именно локальной переменной в Execute? Добавлено через 3 минуты и 34 секунды Переписал код, вроде сейчас все нормально работает. Есть какие то замечания по коду?
|
| Автор: Illusion Dolphin 9.6.2014, 09:46 | ||
Нет, никаких замечаний, всё просто прекрасно |
| Автор: UKRtortik 9.6.2014, 10:14 |
| Я просто не понял как сделать Work:boolean был локальной переменной, у меня перестает код работать. |
| Автор: PointerToNil 9.6.2014, 15:04 |
| Была гипотеза, что строчкой "Work := Num < proxy.Count" тред, взявший на обработку последнюю строку, менял глобальную переменную Work, из-за чего ВСЕ ранее запустившиеся треды разом переставали работать, отваливаясь на проверках "while Work do" и "if Work then". Если она менялась еще и извне (я это упустил) - то, очевидно, нужны 2 переменных - глобальная для "сигнализации" и локальная для условия окончания работы данного треда. > у меня перестает код работать пожалуйста, не пишите больше так! обычно что-то конкретное происходит не так, появляются симптомы, которые можно описать (это не к данному вопросу, тут вроде понятно, но вообще - старайтесь давать как можно больше деталей в своих описаниях) P.S. последнюю версию кода не читал. я уже устал. Работает - отлично, ничего не трогаем. Гипотеза не подтвердилась? Проверили, вернули всё назад, ищем дальше. |
| Автор: UKRtortik 9.6.2014, 15:12 |
| Так что код сейчас правильный или нет? |
| Автор: PointerToNil 9.6.2014, 15:34 |
| а что, по работе непонятно? как бы самому выступить в роли компьютера и весь его исполнить в уме, конечно, можно, только комп-то это быстрее сделает Добавлено через 2 минуты и 22 секунды если в чем-то сомневаетесь - воспользуйтесь средствами отладки (точки останова, просмотр значений переменных, пошаговый прогон) либо выводом отладочных сообщений Добавлено через 4 минуты и 40 секунд тем самым вы "подпрягаете" комп помогать вам искать ошибки, а не тупо анализируете код сами Добавлено через 5 минут и 34 секунды и уж тем более через форум отлаживать прогу - худшая из идей |