![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| jsa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 704 Регистрация: 19.1.2006 Где: Новосибирск Репутация: нет Всего: 20 |
HI All!
столкнулся со следующей проблемой: есть нормальная обычная дллка, подключается динамически, эта дллка экпортирует функцию, которая, в свою очередь, создает поток, выполняющий определенную бизнес-логику, по завершению работы определенного экземпляра потока хотел прикрутить событие OnTerminate... НО, нетут-то было, нифига это событие не работает, стал разбираться почему... оказывается (вычитал у Пачеко), что событие OnTerminte работает в контексте основного потока, а никак не контексте самого потока, в этом вся и сложность! Где мне взять основной контекст, если поток запускается из динамически загружаемой библиотки - это одна проблема, вторая (наверное более сложная) - есть такое понятие как DLL Entry Point (о чем всезнающий алл прекрасно знает), а в частности DLL_THREAD_DETACH, где DLL_THREAD_DETACH будет работать (важно!) в контексте конкретного потока!!!(у того же Пачеко). И действительно!!! работает! НО, встает самая важная проблема - идентифировать поток, что бы получить доступ к публичным методам и свойствам (в этом вся соль - получить данные из потока, перед его уничтожением, когда execute завершен) Можно попробывать GetCurrentThread, но она(функция) возвращает псевдохендл потока, и необходимо сделать Duplicatehandle, как этим пользоваться? не догоняю! -------------------- Все мы, на перине с песней, строим небо на земле © Ю. Шевчук |
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Хм... ни разу не пробовал делать потоки из длл... но что-то мне подсказывает, что ты сильно путаешь...
Вопервых, неважно в каком контексте, но OnTerminate должно происходить. И если ты его назначаешь, то метод должен быть вызван. Если нелады с синхронизацией, то будут ошибки, но сам обработчик обязан вызываться. Но, если вдруг это и так, и он действительно из длл не вызывается, то возьми и сам вызови его при выходе из execute. Или можешь вообще свое событие сделать и его вызывать... -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
событие TThread.OnTerminate тем и хорошо, что вызывается в контексте главного потока и не требует доп.телодвижений для синхронизации.
в чем сложность? не вижу сложности. что тебе надо то? а зачем? смысл то какой? Добавлено через 2 минуты и 37 секунд
вызови GetCurrentThreadID. только смысл? -------------------- There are always someone smarter than you... |
|||
|
||||
| jsa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 704 Регистрация: 19.1.2006 Где: Новосибирск Репутация: нет Всего: 20 |
весь смысл в том чтобы заработало событие OnTerminate, понятно что код можно вызвать в конце execute, но тут уже дело принципа - почему не работает OnTerminate
опять же DLL_THREAD_DETACH предназначено не только для ShowMessage('thread finished') Добавлено через 1 минуту и 43 секунды получить данные из потока, перед его уничтожением, когда execute завершен -------------------- Все мы, на перине с песней, строим небо на земле © Ю. Шевчук |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Возможно, что OnTerminate вызывается из OnIdle application, а application dll и exe разные, причем application dll мервый (т.е. не крутиться в очереди сообщений), потому OnIdle и не вызывается. Можно попробовать application dll заменить на application exe (присвоить указатели).
Добавлено через 1 минуту и 59 секунд Это я предположил из тех соображений, что так Syncronize работает, вполне возможно, что OnTerminate работает аналогично ведь нужно же где-то основному потоку войти в критическую секцию и заблокироваться. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| jsa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 704 Регистрация: 19.1.2006 Где: Новосибирск Репутация: нет Всего: 20 |
Alexeis, попробую, может действительно поможет, спасибо за совет
-------------------- Все мы, на перине с песней, строим небо на земле © Ю. Шевчук |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 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 вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| jsa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 704 Регистрация: 19.1.2006 Где: Новосибирск Репутация: нет Всего: 20 |
Alexeis, первый этап я еще могу представить, до 2 и 3 - я явно не дорос
но все равно спасибо за наставление ЗЫЖ у меня VCL EXE + чистый DLL (без какого либо VCL) -------------------- Все мы, на перине с песней, строим небо на земле © Ю. Шевчук |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
TThread это VCL. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |