15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
|||||||||||
1 | |||||||||||
Непонятное поведение программы с потоками04.10.2017, 13:56. Показов 1940. Ответов 17
Метки нет Все метки)
(
Решил начать с примитива и сразу же проблемы!
Читаю в переводе книгу Мартина Харвей по Многопоточности и первый же пример глючит. Программа должна определять, является ли число простым. При вымполнении программы происходит что-то непонятно: 1.Если введено не целое число не отрабатывает исключение: Вложение 869894Вложение 869895 2.Если значение целое число не всегда появляется сообщение из потока. Хотя поток создаётся, вычисляет и завершается. Вложение 869896 3.В режиме отладки, когда ставлю BreakPoint сообщение появляется. Вложение 869897 В чём беда? В настройках компилятора? Использую Delphi 2010. Код основной формы:
1
|
|
04.10.2017, 13:56 | |
Ответы с готовыми решениями:
17
Непонятное поведение программы Непонятное поведение процедуры MD5 непонятное поведение Непонятное поведение getera property |
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
|
04.10.2017, 14:09 [ТС] | 3 |
Это как первый пример в книге и неправильный вариант реализации. Но самое интересное, что с BreakPoint'ом работает))
А почему ShowMessage не должен отрабатывать в потоке?
0
|
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
|
04.10.2017, 14:47 [ТС] | 4 |
И почему не срабатывает Try except end;?
0
|
04.10.2017, 16:30 | 5 |
потому что поток вообще не должен бы иметь никакого интерфейса
если запустить 5 потоков, они засыплют экран диалогами, при этом еще и главный поток будет работать )) а с чего должен бы сработать except ? try создать поток - создался норм сказали потоку запустись - запустился норм except ... end программа спокойно работает дальше Execute потока будет работать совершенно отдельно. Вне рамок try-except
0
|
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
||||||
05.10.2017, 06:17 [ТС] | 6 | |||||
У меня то немного по-другому, поток создаётся до try, а в try передаётся значение переменной, и если возникает ошибка, поток должен освобождаться и выскакивать моё сообщение об ошибке, а выскакивает системное при передаче переменной:
0
|
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
|||||||||||
05.10.2017, 08:46 [ТС] | 8 | ||||||||||
Так не доходит программа до создания потока.
0
|
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
|
05.10.2017, 10:00 [ТС] | 10 |
krapotkin, это весь код. Прога в две строчки. Может глюки компилятора, или настройки проги есть какие?
Я в архиве оставил скомпилированный мной проект. Такая же ошибка выходит?
0
|
05.10.2017, 10:31 | 11 | |||||
1
|
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
||||||||||||||||
05.10.2017, 12:40 [ТС] | 12 | |||||||||||||||
Нашёл проблему - программа ругается на NewThread.Free; в части except
В первой стоке идёт создание потока. Почему компилятор ругается на NewThread.Free? Даже в такой связке ругается:
Не по теме: P.S.: Я согласен, что нефиг создавать поток, если велика вероятность, что придётся его тут же уничтожать. В данном примере моя цель не рабочая программа, а разобраться в логике работы потока. И если есть проблемы с созданием и остановкой, то дальше идти просто безответственно и в нормальных проектах будут большие проблемы:scratch:
0
|
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
|
|
05.10.2017, 12:59 | 13 |
Это вообще уберите
и оставьте так Если поток поймает ексепшен он завершится и освободится самостоятельно. Добавлено через 1 минуту Если НЕ поймает, то после завершения сам уничтожится.
0
|
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
||||||
05.10.2017, 13:14 [ТС] | 14 | |||||
TFullControl, в подобном коде поток даже не успевает запуститься:
0
|
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
|
|
05.10.2017, 14:22 | 15 |
FearDog, читайте посто №11 от крапоткина, он уже дал вам ответ как в таком случае правильно создавать поток и обрабатывать исключения.
0
|
05.10.2017, 16:39 | 16 | |||||
![]() Решение
для того, чтобы понять механизм, просто в своем классе переопределите
и вы узнаете, когда уничтожился ваш поток...
1
|
15 / 15 / 14
Регистрация: 19.08.2012
Сообщений: 105
|
|||||||||||
06.10.2017, 13:02 [ТС] | 17 | ||||||||||
Просто бездумно создать рабочий вариант - не сама цель. Код из первого поста отрабатывает в Delphi 7, но категорически отказывается работать в Delphi 2010. Я хочу понять не как нужно (это я уже понял), а причину, почему нельзя.
Спасибо за наводку. Буду копаться и изучать поведение потока при создании/ошибке/разрушении) И Ваш пост в блоге тоже прочту в свободное время) Добавлено через 5 часов 2 минуты Изучил поведение программы и вот что заметил:Если FreeOnTerminate:=True, то освобождение потока методом Free вызывает Destroy дважды. Я извратился над кодом и пришёл к выводу, что если FreeOnTerminate:=True, то перед уничтожением потока нужно присваивать FreeOnTerminate:=False, и лишь потом вызывать Free. Такой код работает как задумано:
Но это всё в Delphi 7. krapotkin, как можно посмотреть исходники Classes.dcu в поздних версиях?
0
|
06.10.2017, 13:59 | 18 |
эммм ???
просто если FreeOnTerminate=true то нет никакой надобности вызывать Free
0
|
06.10.2017, 13:59 | |
06.10.2017, 13:59 | |
Помогаю со студенческими работами здесь
18
Непонятное поведение TEdit Непонятное поведение программы
Непонятное поведение программы
Непонятное поведение программы! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |