![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Specialistvlad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Всем привет. С потоками раньше не работал, пытаюсь первый раз. Загуглив ответа не нашел.
В общем пишу некоторую программу, для работы с УСБ. Задача такая: при подключении устройства определить нужно оно или нет, если нужное - то создать поток для него(пока максимум один). Вот тут и начинаются проблемы. У меня почему в диспетчере задач показывает после создания потока их кол-во не 2, а 3! Может так и должно быть это ладно. Вроде бы все работает. Но после того как я при отключении устройства хочу пректратить поток он закрывается и резко загрузка процессора становится 100%. В диспетчере вижу, что кол-во потоков теперь не 3, а 2. И сами вопросы. Почему при запуске приложения 1 поток, а когда создаю еще один их становится 3. :щацко Вроде бы после 1 идет 2. И почему загрузка процессора максимальная? Ткните в ошибку плз. Лог работы на скрине. ![]() Код программы:
Это сообщение отредактировал(а) Specialistvlad - 20.10.2010, 13:36 |
|||
|
||||
ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
А где код остановки потока ?
|
|||
|
||||
Specialistvlad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Вот в этой процедуре
|
|||
|
||||
RomanEEP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
1) Если процессор загружен программой, значит что-то выполняется. Попробуй воткнуть точки останова на возможные места, например TNewhread.Execute. Возможно программа начинает крутиться где-нибудь в цикле процедуры, которая вызывает TNewhread.Execute.
2)Еще лучше будет сперва также посмотреть какой процесс занимает процесорное время. Может помочь также установка программы на паузу в Delphi 3)Надо обнулять указатель devThread при его уничтожении потока. Т.к. этого нет, то программа гарантировано зависнет на закрытии 4)Потоков может быть много - любая виндовая функция может создавать потоки, в используемых DLL, в компонентах.. в общем где угодно. Потоку можно присвоить имя для удобства отладки 5)не стоит назначать приоритет tphighest. Производительности это не прибавит, зато повесит остальные приложения и интерфейс. |
|||
|
||||
Specialistvlad |
|
||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
1.
Ты лог смотрел? Или пропустил его ? Там явно видно, что с TNewhread.Execute выходит т.к. выполняются строки
и с этого потока программа выходит. Другой мною поток не был создан. Или создан но я не знаю об этом.(Добавлено: программа в процедуру TNewhread.Execute не заходит после того как я завершаю поток (devThread.Terminate;), проверил с помощью точек останова) 2.
3.
А разве при создании потока не хватает для этого такой строчки?
4.
А это тут причем? Речь идет только о моем проекте, а не о других программах. 5.
Возьму на заметку, но когда я лоувер приоритет ставлю, то остановка потока продолжается где-то 1.5секунды, а с этим приоритетом - моментально. |
||||||||||||||
|
|||||||||||||||
ZBugz |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Я ничего по коду понять не могу
![]() devThread.Terminated обычно не работает, у меня точно ![]() Далее,
не корректно, потому что Terminate не гарантирует остановку потока. Это тока комманда на остановку потока. Поэтому вывод в memo смысла не имеет. Его надо заменить на Memo_Log.Lines.Add('Метод терминат ушел'); Тут лучше свой деструктор делать. Так же не пойму код, я конечно понимаю что он урезан, но возможно проблема с выводом инфы, в execute убери любое vcl обращение да и проверь как будет. Добавлено через 2 минуты и 12 секунд
Не гарантирует остановку потока. Остановку потока гарантирует только свой деструктор. Добавлено через 3 минуты и 14 секунд И тебе сказали првильно:
Не важно что это твоя программа, тут как винда решит, тормозить его или нет. Это сообщение отредактировал(а) ZBugz - 20.10.2010, 19:28 |
||||||
|
|||||||
Specialistvlad |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Теперь я понял о чем вы. В данном случае, скорее всего, третий поток принадлежит компоненту "JvHIDController". Который начинает работать с моим USB устройством.
Никаких изменений.
Суть проста. В процедуре procedure TForm1.Hid1Enumarate(HidDev: TJvHidDevice); - создавать поток, а в procedure TForm1.Hid1Removal(HidDev: TJvHidDevice); - уничтожать поток. Подскажите пожалуйста, правильный, рабочий деструктор. Потому что из всех статей, что я видел там был такой способ реализован как у меня. То есть Создается поток и начинает выполнятся процедура TNewhread.Execute, внутри которой цикл со слипом, из него выход возможен, только когда свойство devThread.Terminated; будет true. А true можно установить с помощью devThread.Terminate; |
||||||
|
|||||||
ZBugz |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Ну я люблю писать потоки с посылом сообщений, тогда точно знаешь что усе завершилось.
Пример с отдельным юнитом потока и основной формой....
А в форме добавляешь uses unit треда потом это:
Кнопка стоп
А вот и сама процедура завершения, тут уже 100% поток завершен и можешь делать что хочешь.
Уж извиняй, в блокноте писал ![]() |
||||||||
|
|||||||||
RomanEEP |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
Описался, имел ввиду узнать какой поток занимает процессорное время и попытаться его остановить отладчиком в Delphi
Нет, конечно. Эта строчка уничтожает объект потока после того как он отработал. Как известно, на этот объект может быть множество указателей, о которых может знать только программист, который их объявлял. В твоем случае есть только один указаль - devThread и его следует обнулять, например, в деструкторе потока. |
||||
|
|||||
Specialistvlad |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
ZBugz, спасибо за такой подробный код и описание. Пришлось подпилить напильником, много незначительных ошибок, из-за блокнота=) но это не суть, вот что получилось у меня.
Вылетает на этой строке в эксепшон, не пойму, эт что конструктор сам себя запускает?) Я в
P.S. Я пишу на Си для микроконтроллеров и к прикладному программированию мало отношения имею. А вспомнил, что когда-то под делфи пробовал писать под виндоуЗ, то взялся за него.. Это сообщение отредактировал(а) Specialistvlad - 21.10.2010, 11:34 |
||||
|
|||||
Specialistvlad |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Не пойму как это работает.
|
||||
|
|||||
ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
||||
|
||||
Specialistvlad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Мего спасибо! Завелось и работает!))
|
|||
|
||||
ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Пожайлуста, как на СИ переведешь, можешь выложить пример в нужном разделе, может кому пригодиться.
И не забудь что
А 0 можно как любые события потом обрабатывать, это l.param |
|||
|
||||
Specialistvlad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Ты не понял, я на си пишу ответную программу под микроконтроллер, а в делфях прикладнуху. Вот так. =)
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |