Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему глючит showmodal в Thread?


nester ©   (2004-04-01 14:19:00) 

Я делаю Showmodal как указано в факах, пробую оба варианта и с динамическим созданием формы и c показом скрытой.
Если это делать за пределами Thread - то без проблемм, все работает зашибись. Запихиваю в Thread- вылетает КОЛ в функции:
function TControl.GetWindowHandle: HWnd;
Если запускаю этот же тред в отладочном режиме (по F8) то нифига не вылетает, весь тред нормально отрабатывается, а если просто запускаю(по F9) то вылетает, для чичтоты эксперимента запускал и просто ехезшник - все равно вылетел.
Ктонибудь знает в чем проблемма?
Кол 1.91. Делфи 7. ХР.


SPeller   (2004-04-02 04:05:00) [1]


> Вариант конечно, но тогда в потоке придется делать бесконечный
> цикл

Не надо никаких циклов! Функция ShowModal не возвращается до тех пор, пока не закроется модальное окно.


Владимир Кладов   (2004-04-01 21:41:00) [2]

все это чудно делается методом Synchronize, причем и в VCL тоже. Synchronize просто посылает (SendMessage) сообщение в главный поток, там оно пока не отработает, поток обратно управление не получит. В KOL есть модификация этого метода, позволяет еще и параметры передать, хотя бы через структуру. Все проще, чем сначала параметр в глобальную переменную руками засовывать, потом Thread1.Synchronize( CallMyFormModal ) вызывать.

В любом случае, через Synchronize или руками так делать, надо не забывать, что если в тот момент, когда выполняется синхронизированный метод, главный поток решит, что поток надо подождать, то все намертво зависнет.


nester   (2004-04-01 20:30:00) [3]

2Speller
Вариант конечно, но тогда в потоке придется делать бесконечный цикл и ждать пока модальное окно закроется, а я не сторонник бесконечных циклов. Но можно совместить оба варианта:)))
Послать мессадж главному окну, чтобы то показало модальное, а самому треду засаспендиться:))
Ну а когда модельное окно закроется резюмить тред:)))


Владимир Кладов   (2004-04-01 19:38:00) [4]

Криминала может и нет. Но дело в том, что в Windows каждый поток имеет свою очередь сообщений. Даже в VCL диспатчеризация сообщений видимо представляет некоторую трудность, так что в учебниках по Delphi рекомендуется так не делать. На самом деле самая большая проблема при работе нескольких потоков вообще в разделении ресурсов. Например желательно указать IsMultiThead := TRUE; (кажется это не делается в коде KOL.TThread, надо поправить) иначе возникают проблемы при асинхронном обращении к менеджеру памяти из разных потоков (а оно происходит всегда и часто, и часто не может быть проконтролировано своим кодом). Совсем недавно я обнаружил еще одну проблему: разделение регистров с плавающей запятой между потоками. Причем, на этот раз я вообще не понял как к этой проблеме подойти, если в одном потоке эти регистры используются как mmx-регистры на уровне встроенного ассемблера, а в другом - для операцией с плавающей точкой при обычных вычислениях. Обошел тем, что полностью заменил все вычисления на фиксированную точку, другого пути просто не нашел.


SPeller   (2004-04-01 17:49:00) [5]

Немного криво. Вообще, лучше всего отправить главному окну сообщение через SendMessage, чтобы поток-отправитель ждал конца обработки сообщения, а в обработчике показать модальную форму. Всё гладко и элегантно :)


nester   (2004-04-01 16:56:00) [6]

Хехе, пошел таким путем

Form3.Form.Show;
Form1.Form.Enabled:= false;
Form1.Thread1.Suspend;
Form1.Form.Enabled:= true;

Ну а там в форме соответственно где нужно

Form3.Form.hide;
Form1.Thread.Resume;

:)))


nester   (2004-04-01 16:14:00) [7]

Не, немного не так, у меня есть форма созданая при запуске(основная форма).
Я нажимаю на кнопку - запускается треад.
Ну когда в треде наступает условие Х нужно вывести форму модально по отношению к основной, чтобы на основную нельзя было нажать, пока не закроется вызваная.
2Кладов. А чесно говоря не вижу никакого криминала в работе с визуальными компонентами в тредах.
Как вы иначе посоветуете запускать "тяжелые" процедуры, чтобы прорисовывалось при этом основное окно и с ним можно было бы работать.
Processmessages не катит.


SPeller   (2004-04-01 15:34:00) [8]

А я и с окнами работал.... Неужели это принципиально неправильно?

По сабжу:
Ты как, делаешь? У тебя есть форма, созданная в одном потоке, а ты хочешь поверх неё показать модально другую форму, созданную в другом потоке?


Владимир Кладов   (2004-04-01 14:59:00) [9]

Кто же в потоке вообще с визуальными объектами работает. В VCL разве этому учат. Максимум что можно из потока без синхронизации - с простыми общими переменными поработать, или сообщение окну послать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо