Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки и DLL, не отрабатывает OnTerminate 
:(
    Опции темы
jsa
Дата 17.12.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



HI All!

столкнулся со следующей проблемой:
есть нормальная обычная дллка, подключается динамически, эта дллка экпортирует функцию, которая, в свою очередь, создает поток, выполняющий определенную бизнес-логику, по завершению работы определенного экземпляра потока хотел прикрутить событие OnTerminate... 

НО, нетут-то было, нифига это событие не работает, стал разбираться почему... оказывается (вычитал у Пачеко), что событие OnTerminte работает в контексте основного потока, а никак не контексте самого потока, в этом вся и сложность!  

Где мне взять основной контекст, если поток запускается из динамически загружаемой библиотки - это одна проблема, вторая (наверное более сложная) - есть такое понятие как DLL Entry Point (о чем всезнающий алл прекрасно знает),
а в частности DLL_THREAD_DETACH, где DLL_THREAD_DETACH будет работать (важно!) в контексте конкретного потока!!!(у того же Пачеко). И действительно!!! работает! 

НО, встает самая важная проблема - идентифировать поток, что бы получить доступ к публичным методам и свойствам (в этом вся соль - получить данные из потока, перед его уничтожением, когда execute завершен)
Можно попробывать GetCurrentThread, но она(функция) возвращает псевдохендл потока, и необходимо сделать Duplicatehandle,
как этим пользоваться? не догоняю!  smile 


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Felan
Дата 17.12.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Хм... ни разу не пробовал делать потоки из длл... но что-то мне подсказывает, что ты сильно путаешь...
Вопервых, неважно в каком контексте, но OnTerminate должно происходить. И если ты его назначаешь, то метод должен быть вызван. Если нелады с синхронизацией, то будут ошибки, но сам обработчик обязан вызываться.

Но, если вдруг это и так, и он действительно из длл не вызывается, то возьми и сам вызови его при выходе из execute. Или можешь вообще свое событие сделать и его вызывать...




--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 17.12.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



событие TThread.OnTerminate тем и хорошо, что вызывается в контексте главного потока и не требует доп.телодвижений для синхронизации.

Цитата(jsa @  17.12.2007,  08:48 Найти цитируемый пост)
а никак не контексте самого потока, в этом вся и сложность

в чем сложность? не вижу сложности. что тебе надо то?

Цитата(jsa @  17.12.2007,  08:48 Найти цитируемый пост)
НО, встает самая важная проблема - идентифировать поток, что бы получить доступ к публичным методам и свойствам (в этом вся соль - получить данные из потока, перед его уничтожением, когда execute завершен)

а зачем? смысл то какой?

Добавлено через 2 минуты и 37 секунд
Цитата(jsa @  17.12.2007,  08:48 Найти цитируемый пост)
Можно попробывать GetCurrentThread, но она(функция) возвращает псевдохендл потока, и необходимо сделать Duplicatehandle,

вызови GetCurrentThreadID. только смысл?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
jsa
Дата 17.12.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



весь смысл в том чтобы заработало событие OnTerminate, понятно что код можно вызвать в конце execute, но тут уже дело принципа - почему не работает OnTerminate 

опять же DLL_THREAD_DETACH предназначено не только для ShowMessage('thread finished')

Добавлено через 1 минуту и 43 секунды
Цитата(MetalFan @  17.12.2007,  16:19 Найти цитируемый пост)
НО, встает самая важная проблема - идентифировать поток, что бы получить доступ к публичным методам и свойствам (в этом вся соль - получить данные из потока, перед его уничтожением, когда execute завершен)а зачем? смысл то какой?


получить данные из потока, перед его уничтожением, когда execute завершен



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Alexeis
Дата 17.12.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Возможно, что OnTerminate вызывается из OnIdle application, а application dll и exe разные, причем application dll мервый (т.е. не крутиться в очереди сообщений), потому OnIdle и не вызывается. Можно попробовать application dll заменить на application exe (присвоить указатели).

Добавлено через 1 минуту и 59 секунд
  Это я предположил из тех соображений, что так Syncronize работает, вполне возможно, что OnTerminate работает аналогично ведь нужно же где-то основному потоку войти в критическую секцию и заблокироваться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
jsa
Дата 17.12.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



Alexeis, попробую, может действительно поможет, спасибо за совет


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Alexeis
Дата 17.12.2007, 17:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



jsa, вообще ИМХО VCL и Dll вещи малосовместимые и неудобные для взаимодействия. Мне видится 4 пути развития.
1) VCL приложение WinApi Dll
2) VCL приложение BPl как аналог Dll (реализация VCL во внешней BPl)
3) VCL приложение, вся работа со стандартными компонентами исключительно внутри приложения, для наследников VCL определен необходимый интерфейс. Классы конструируются исключительно в Exe, а Dll получает к ним доступ через интерфейсы
4) И классика COM ActiveX.

VCL Dll + VCL exe не клеится, да и криво дублировать код VCL.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
jsa
Дата 17.12.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: нет
Всего: 20



Alexeis, первый этап я еще могу представить, до 2 и 3 - я явно не дорос  smile , не говоря уже о 4-ом 
но все равно спасибо за наставление  smile 

ЗЫЖ у меня VCL EXE + чистый DLL (без какого либо VCL)


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Alexeis
Дата 18.12.2007, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(jsa @  17.12.2007,  19:08 Найти цитируемый пост)
ЗЫЖ у меня VCL EXE + чистый DLL (без какого либо VCL) 

  TThread это VCL.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.