![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Ryoga |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 20.9.2005 Репутация: нет Всего: 6 |
Значит, есть две формы A и B. Также (в форме A) определён поток T и единственный его метод - Execute.
Создаётся поток при нажатии на кнопку в форме A. Происходит, скажем так, сопоставление объектов из базы данных. Если такого объекта в базе нет, то процесс T приостанавливается - Suspend. При этом мы можем вручную, на форме A выбрать нужный объект из дерева, после чего нажать на кнопку "продожить" - вызывается
Теперь понадобилось при конвертации сопоставлять кучу параметров, которые на форму A уже не влезают. Была создана форма B, в которой эти параметры можно выбрать. В проток T добален код
При закрытии формы предполагается вызов A.T.Resume(), но всё благополучно зависает при выводе формы. Опеределил я в форме B метод и сделал, чтобы он вызывался по сообщению.
Поток T исправил на
Думал зависать не будет, но оно всё равно зависает. Почему так происходит? |
||||||||
|
|||||||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
Не понял, ты из потока к объектам формы обращаешся? Если да, то необходима синхронизация...
|
|||
|
||||
| Ryoga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 20.9.2005 Репутация: нет Всего: 6 |
Ну да, я обращаюсь из потока к объектам и методам форм, в том числе и той, в которой он был создан (форма A). Всё было хорошо, пока я не попытался показать форму B и что-нибудь из неё выбрать, приостановив поток, созданный в форме A. В каком месте необходима синхронизация?
З.Ы.: С названием темы напортачил. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
В тех, где ты обращаешься к объектам основного потока. -------------------- |
|||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
Дополню, не только к методам но и к памяти (не важно объект, переменная, константа, метод или еще что-то там храниться), которая выделена не тем потоком из которого идет обращение...
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Ну до этих глюков еще добраться нужно, а для начала все обращения к объектам VСL из потока делай с помощью TThread.Synchronize -------------------- Обижено школьников: 8 |
|||
|
||||
| BinaryEvil |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 4.3.2006 Репутация: -1 Всего: 2 |
ключевые слова по синхронизации: mutex, criticalSection
раз форма не отвечает, значит ты не правильно поток аформил - у тебя все происходит в потоке самой формы. хоть это и неправильно, но лично я обхожусь в подобных ситуациях просто application.proccessmessages (цикл get/translate/dispatchmessage), без каких либо потоков... |
|||
|
||||
| Ryoga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 20.9.2005 Репутация: нет Всего: 6 |
Так, я почитал статью выше и ещё кое-что...
Как я понимаю, параметром synchronize может быть только функция без параметров? Ну, я взял и определил функцию, в которой у меня выполняется всё, что раньше было в Execute. Теперь код выглядит так.
Так вот, синхронизация вызова Pro означает ли, что у меня синхронизировано всё, что выполняется в этой процедуре? В принципе, баги с зависанием и вылетом на экран сообщения "Неверный дескриптор формы" после определённых действий, после того, как я исправил программу вышеуказанным образом прекратились. Но я всё ещё не уверен - было ли это решением проблемы. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Ryoga,
Категорически неверно. в Synchronize нужно толкьо обращение к общим объектам обертывать. Все остальные расчеты должны вестись в Execute. Особенность Synchronize - функция, которая передается в качестве параметра, выполняется в контексте основного потока. -------------------- |
|||
|
||||
| Ryoga |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 20.9.2005 Репутация: нет Всего: 6 |
То есть, и остановка то потока не произойдёт, когда надо, т.к. всё идёт в другом потоке, получается?
Ну хорошо. А если написать так?
Теперь синхронизация только, когда устанавливаем параметры в другой форме и выводим её на экран. |
|||
|
||||
![]()
|
| Правила форума "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. |