Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

Почему глючит 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 вся ветка

Форум: "KOL";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.031 c
3-1093254733
Kraj
2004-08-23 13:52
2004.09.26
jpg в базу данных


4-1092406955
webpauk
2004-08-13 18:22
2004.09.26
ShortCat для меню


3-1093790798
Andrey V.
2004-08-29 18:46
2004.09.26
Locate в TDbf (кодировка?)


14-1094722436
bobr12
2004-09-09 13:33
2004.09.26
Как сделать строку в которой есть кавычки


4-1091445353
the_ram
2004-08-02 15:15
2004.09.26
Tray





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский