![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
Собственно сабж.
Есть простой способ это сделать без извратов с Messageами? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
сам организуй обмен -- держи общий ресурс ( список/очередь ) и пиши в него из потоков. а какой-нит менеджер будет читать...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
Нужно, чтобы форма вызвала процедуру, после того как поток уже полностью отработает... Пока что сделал, чтобы в Поток.ОнТерминэйт включался таймер, а сама процедура запускалась уже из таймера... Просто интересно, может быть есть какое-то более элегантное решение |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
более элегантное решение ( в данной ситуации ) -- послать форме сообщение.
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
мне не очень хочется связываться с сообщениями... |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
и чем это нежелание обосновано?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
во-первых жутким страхом новизны
во-вторых, поверхностным знанием темы: не хочется попасть в ситуацию, когда сгенерированный мной Message(WM_USER+999 например), уже будет использоваться другим приложением в-третьих: мне кажется, что Messageи стоит использовать в тех случаях, когда без них ну никак не обойтись - например для оповещения других(своих) приложений или форм, до которых средствами Дельфей не добраться.. в-четвертых: imho использование Messageй сродни использованию оператора Goto... будет сложнее ориентироваться в коде и отслеживать ошибки.. в-пятых: в данном конкретном случае, такой вызов надо сделать всего один раз |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
страхи нужно преодолевать
а с какой стати кто-то будет слать твоей программе свое сообщение? а тут другими средствами ( не считая синхронизации ) и не доберешся... делегатов в делфи нету. введение потоков так же ( и таким же образом ) усложняет ориентирование. поэтому послать сообщение проще, чем заморачиваться с синхронизацией. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Bose |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
но в данном конкретном случае, мне нужно быть уверенным, что процедура выполнится, только тогда, когда поток будет завершён... а сообщение этого не гарантирует.... Насколько я знаю, выполняется OnTerminate в контексте основного(VCL) потока, т.е. тогда, когда поток закончил свою работу, но еще не разрушен... И... насколько я понимаю, проводить синхронизацию в этом событии необязательно..(поправьте меня если я ошибаюсь)
Увы |
||||||
|
|||||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
могут конечно и гулять, но это уже параноя -- как ты быдеш знать что никто кроме пользователя не нажмет на кнопку, не откроет файл...
почему? есть, конечно, вероятность потери сообщения, но она довольно низкая ( и это опять же параноя ) но если есть серьезные основания для волнения по этим пунктам -- пиши менеджер потоков. это так, но ты же сам писал "но нельзя её вызывать в OnTerminate." или я что-то пропустил? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Bose |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
я не понимаю, как отсылка сообщения может это гарантировать... Предположим я отсылаю сообщение в обработчике OnTerminate.... Его принимает моя форма и вызывает нужную процедуру. Но я не уверен, что система форма не обработает это сообщение до разрушения потока(выхода из OnTerminate) или я заблуждаюсь?.
про событие OnTerminate я писал к тому, что в этом конкретном случае нет никаких заморочек с синхронизацией вариант с OnTerminate у меня не работает. Я и тему создал, чтобы понять как обойти это событие |
||||||||
|
|||||||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
ты отсылаеш сообщение последней строкой Execute' а потока. это гарантирует что поток не выполняется ( зачем может понадобится гарантия разрушения?.. )
я понял, что я ничего не понял... рассказывай о проблеме ( и задаче ) с самого начала -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: нет Всего: 51 |
_hunter проблема была такая:
по окончании действия потока, нужно было вызвать одну процедуру(которая создавала модальную форму, выполняла некоторые длмтельные действия, закрывалась и освобождала форму). Идеальным решением было бы вызвать эту процедуру в событии потока OnTerminate. Но... этот вариант почему-то не работал. Процедура запускалась, форма создавалась, но, действия не выполнялись Точнее после уничтожения, потому что поток работает с БД, и отключается от неё в событии OnTerminate. Процедура, которую мне нужно вызвать, должна работать с этой же БД. Вот и был вопрос как вызвать мою процедуру не из потока, когда поток перестанет существовать. В качестве решение проблемы я сделал следующее: поставил на форму выключенный таймер с интервалом 1000 мс. в событии потока onTerminate этот таймер включается в событии onTimer таймера запускается моя процедура Проблема решена, но решение некрасивое. Зато работает |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
а зачем отключаться в OnTerminate? отключайся в потоке.
+ лучше бы проблему додавил а не обходы искал... ++ с таймером код стал гораздо чибальнее и понятнее? ;) P.S. отправка сообщения ( в данном случае ) -- идеальный вариант. P.P.S. а что будет если паралельно кто-то запустит тяжелый процесс ( и за секунду твой отключиться не успеет )? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Демо |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Bose
OnTerminate - как раз то место, которое нужно использовать для подобной задачи. Так как ты не привел код потока, то могу предположить, что завершающие действия по работе с БД у тебя находятся в деструкторе. Следовательно, в OnTerminate ты пытаешься работать без завершения рабты с базой. OnTerminate вызывавется ДО деструктора Destroy. В твоем случае метод решения может быть простой:
Вызов:
Добавлено @ 12:32 Сорри, процедуру OnComplete надо исключить из методов класса:
PS. Писал прямо здесь, могут быть опечатки. Это сообщение отредактировал(а) Демо - 8.2.2006, 12:33 -------------------- |
||||||
|
|||||||
![]()
|
| Правила форума "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. |