Текущий архив: 2004.09.26;
Скачать: CL | DM;
ВнизПочему глючит showmodal в Thread? Найти похожие ветки
← →
nester © (2004-04-01 14:19) [0]Я делаю Showmodal как указано в факах, пробую оба варианта и с динамическим созданием формы и c показом скрытой.
Если это делать за пределами Thread - то без проблемм, все работает зашибись. Запихиваю в Thread- вылетает КОЛ в функции:
function TControl.GetWindowHandle: HWnd;
Если запускаю этот же тред в отладочном режиме (по F8) то нифига не вылетает, весь тред нормально отрабатывается, а если просто запускаю(по F9) то вылетает, для чичтоты эксперимента запускал и просто ехезшник - все равно вылетел.
Ктонибудь знает в чем проблемма?
Кол 1.91. Делфи 7. ХР.
← →
Владимир Кладов (2004-04-01 14:59) [1]Кто же в потоке вообще с визуальными объектами работает. В VCL разве этому учат. Максимум что можно из потока без синхронизации - с простыми общими переменными поработать, или сообщение окну послать.
← →
SPeller © (2004-04-01 15:34) [2]А я и с окнами работал.... Неужели это принципиально неправильно?
По сабжу:
Ты как, делаешь? У тебя есть форма, созданная в одном потоке, а ты хочешь поверх неё показать модально другую форму, созданную в другом потоке?
← →
nester © (2004-04-01 16:14) [3]Не, немного не так, у меня есть форма созданая при запуске(основная форма).
Я нажимаю на кнопку - запускается треад.
Ну когда в треде наступает условие Х нужно вывести форму модально по отношению к основной, чтобы на основную нельзя было нажать, пока не закроется вызваная.
2Кладов. А чесно говоря не вижу никакого криминала в работе с визуальными компонентами в тредах.
Как вы иначе посоветуете запускать "тяжелые" процедуры, чтобы прорисовывалось при этом основное окно и с ним можно было бы работать.
Processmessages не катит.
← →
nester © (2004-04-01 16:56) [4]Хехе, пошел таким путем
Form3.Form.Show;
Form1.Form.Enabled:= false;
Form1.Thread1.Suspend;
Form1.Form.Enabled:= true;
Ну а там в форме соответственно где нужно
Form3.Form.hide;
Form1.Thread.Resume;
:)))
← →
SPeller © (2004-04-01 17:49) [5]Немного криво. Вообще, лучше всего отправить главному окну сообщение через SendMessage, чтобы поток-отправитель ждал конца обработки сообщения, а в обработчике показать модальную форму. Всё гладко и элегантно :)
← →
Владимир Кладов (2004-04-01 19:38) [6]Криминала может и нет. Но дело в том, что в Windows каждый поток имеет свою очередь сообщений. Даже в VCL диспатчеризация сообщений видимо представляет некоторую трудность, так что в учебниках по Delphi рекомендуется так не делать. На самом деле самая большая проблема при работе нескольких потоков вообще в разделении ресурсов. Например желательно указать IsMultiThead := TRUE; (кажется это не делается в коде KOL.TThread, надо поправить) иначе возникают проблемы при асинхронном обращении к менеджеру памяти из разных потоков (а оно происходит всегда и часто, и часто не может быть проконтролировано своим кодом). Совсем недавно я обнаружил еще одну проблему: разделение регистров с плавающей запятой между потоками. Причем, на этот раз я вообще не понял как к этой проблеме подойти, если в одном потоке эти регистры используются как mmx-регистры на уровне встроенного ассемблера, а в другом - для операцией с плавающей точкой при обычных вычислениях. Обошел тем, что полностью заменил все вычисления на фиксированную точку, другого пути просто не нашел.
← →
nester © (2004-04-01 20:30) [7]2Speller
Вариант конечно, но тогда в потоке придется делать бесконечный цикл и ждать пока модальное окно закроется, а я не сторонник бесконечных циклов. Но можно совместить оба варианта:)))
Послать мессадж главному окну, чтобы то показало модальное, а самому треду засаспендиться:))
Ну а когда модельное окно закроется резюмить тред:)))
← →
Владимир Кладов (2004-04-01 21:41) [8]все это чудно делается методом Synchronize, причем и в VCL тоже. Synchronize просто посылает (SendMessage) сообщение в главный поток, там оно пока не отработает, поток обратно управление не получит. В KOL есть модификация этого метода, позволяет еще и параметры передать, хотя бы через структуру. Все проще, чем сначала параметр в глобальную переменную руками засовывать, потом Thread1.Synchronize( CallMyFormModal ) вызывать.
В любом случае, через Synchronize или руками так делать, надо не забывать, что если в тот момент, когда выполняется синхронизированный метод, главный поток решит, что поток надо подождать, то все намертво зависнет.
← →
SPeller © (2004-04-02 04:05) [9]
> Вариант конечно, но тогда в потоке придется делать бесконечный
> цикл
Не надо никаких циклов! Функция ShowModal не возвращается до тех пор, пока не закроется модальное окно.
Страницы: 1 вся ветка
Текущий архив: 2004.09.26;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.063 c