| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > поток запущен, а форма висит |
| Автор: chikistbuch 28.6.2012, 22:05 | ||||
| Всем привет. Пишу все в unit1.
Процедура loaddata запускается и выполняется, а вот форма в это время висит. про потоки читал здесь: http://callipso.bestcode.org/delphi/artical/num2.html |
| Автор: Чучмек 28.6.2012, 22:15 |
| loaddata с формой взаимодействует? Наверняка, иначе зачем тогда Synchronize? Вот Synchronize и блокирует основной поток, наверно. |
| Автор: chikistbuch 28.6.2012, 22:54 | ||||
А как сделать чтобы не блокировала? Пускай sql сформирую в потоке
а как обратно передать значение sql в loaddata и дождаться выполнение TPotok.createSQL, а то пишет что SQL пуст |
| Автор: ZBugz 29.6.2012, 08:18 |
| Попробуй повтыкать Application.ProcessMessages(); |
| Автор: Чучмек 29.6.2012, 09:55 | ||||
Посмотри в чем разница
|
| Автор: MetalFan 29.6.2012, 14:00 |
Верно подметил. Использовать поток только для того, чтобы в нем сразу вызвать Synchronize - бессмысленно. |
| Автор: northener 29.6.2012, 14:09 |
Синхронайз ничего не блокирует. Но все что выполняется внутри Synchronize выполняется в основном потоке. |
| Автор: MetalFan 29.6.2012, 16:49 |
Ну здрасти?! а как он тогда работает? Блокируется поток, вызвавший Synchronize, затем когда доходит дело до выполнения кода процедуры, отданной в Synchronize, основной поток занимается ее выполнением... соотв.ничего более в осн.потоке не работает., после того, как код процедуры отрабатывает в основном потоке, доп.поток продолжает работу. Ну и осн.поток продолжает заниматься своими делами. |
| Автор: northener 29.6.2012, 17:09 |
Ну собственно я отвечал на |
| Автор: northener 30.6.2012, 01:02 |
| Ну и вдогонку. Ну не "блокируется" этот поток! Он продолжает выполняться в соответствии со своим кодом. Но войдя в Synchronize код этого потока выполняется не в нём самом, а в основном потоке приложения. |
| Автор: XperT 30.6.2012, 13:39 | ||
Как раз таки нет: поток переходит в состояние suspend, а управление передаётся основному потоку. Когда нужная функция отработает в основном потоке, вызывающий поток опять получает процессорное время и продолжает свою работу. |
| Автор: northener 1.7.2012, 00:46 |
Это уже похоже на спор о терминологии. Говорим одно и то же, но предпочитаем использовать разные термины. |
| Автор: XperT 1.7.2012, 10:06 |
| Говорим совсем о разном. Попробую объяснить по другому: При вызове Synchronize, вызывающий поток переходит в состояние suspend, т.е. ему перестает выделятся процессорное время, т.е. он блокируется. По вашем описанию похоже, что вы думаете, что на момент выполнения Synchronize этот поток на время становится главным или что-то в этом роде, так как у меня нету предположений как он может не блокироваться и в этот же момент не выполнятся. |
| Автор: chikistbuch 1.7.2012, 13:05 |
| нихера не получается |
| Автор: Чучмек 1.7.2012, 14:23 | ||||
| 1 Преременную Excel в TPotok 2 Основную часть кода из loaddata в Execute 3 Что такое StatusProgressBar? ProgressBar на форме? добавь в TPotok переменные ProgressBar и UniQuery. до запуска потока выполни:
Добавь в TPotok также переменные: ProgressBarPosition ProgressBarVisible ProgressBarMax Все обращения к form1.UniQuery2 StatusProgressBar.Position StatusProgressBar.Visible StatusProgressBar.Max замени на обращения к UniQuery ProgressBarPosition ProgressBarVisible ProgressBarMax с form4.CheckListBox1 - аналогично: В TPotok переменную типа tstringlist, в которую, до запуска потока, копируешь содержимое form4.CheckListBox1.Items в tpotok добавляешь процедуру
Везде где нужно обновить вид StatusProgressBar вызываешь Synchronize(XXX); 4 MessageBox(Application.ActiveFormHandle,... замени, для начала, на MessageBox(0,... 5 Надеюсь UniQuery потокозащищенный компонент. P.S. UniQuery для каждого потока свой P.P.S В TPotok переопредели конструктор, в который будешь сразу передавать form1.Opendialog1.FileName;StatusProgressBar;form1.UniQuery2;form4.CheckListBox1.Items Добавлено через 12 минут и 3 секунды этого тоже не должно быть в потоке. |
| Автор: Чучмек 1.7.2012, 15:11 | ||
| И еще. Знаешь, не знаешь ... Прежде чем вызвать в потоке CreateOleObject необходимо вызвать coinitialize.
|
| Автор: Чучмек 1.7.2012, 20:18 | ||||||||||||||||||
| Еще... В твоем случае можно вообще обойтись без Synchronize. В TPotok объяви переменную hProgressBar:Cardinal (в место ProgressBar), в которую, при инициализации потока, сохраняй StatusProgressBar.Handle В потоке можешь смело использовать
Константы из CommCtrl
|
| Автор: chikistbuch 1.7.2012, 20:32 |
| Охренеть. Чучмек, спасибо конечно, но .... Оставлю этот вопрос на потом. Еще раз спасибо!!! |
| Автор: chikistbuch 1.7.2012, 21:21 | ||||
Всё таки решил попробовать, пишет ошибку:
|
| Автор: Чучмек 1.7.2012, 21:46 |
| Пропиши в uses activex |
| Автор: Чучмек 1.7.2012, 22:08 |
| Опять же... В execute не должно быть ничего типа Application.xxx... и Form1.xxx... - такое только через Synchronize. Переменную Excel объяви в Execute. В execute Excel и закроешь. |
| Автор: chikistbuch 1.7.2012, 22:27 | ||||||
))) а оно все равно работает )))))) Добавлено @ 22:32 Намудрил, сам не знаю что, но работает ))))))) (все в одном unit'е):
|
| Автор: chikistbuch 1.7.2012, 23:14 | ||
Дык, вроде бы и так работает. И не post и не Synchronize. Может потому что XE2 getDB(); - это процедура в которой формируется запрос на вывод данных из БД в DBGrid |
| Автор: Чучмек 1.7.2012, 23:20 | ||
Работает до поры до времени. Одна ветка ЖД и два поезда - без диспетчера рано или поздно поезда столкнутся. |
| Автор: chikistbuch 1.7.2012, 23:46 | ||||
Как-то так |
| Автор: Чучмек 2.7.2012, 00:23 | ||||
Ну почти.
В execute не должно быть обращений к чему либо за пределами класса. Либо копируешь содержимое в переменную класса, либо используешь Synchronize. UniQuery - исключение, компоненты для работы с БД, обычно, потокозащищенные. Но, все равно, нужно(лучше) использовать для каждого потока свой.
|
| Автор: northener 2.7.2012, 00:29 | ||
Тем не менее разговор об одном и том же. Но давайте перестанем спорить(почти оффтопить) в чужом топике. |
| Автор: chikistbuch 2.7.2012, 00:30 |
| Спасибо, Чучмек, ты мозг!!! Просто интересно: где ты работаешь и какая зарплата (заработок)??? |
| Автор: northener 2.7.2012, 00:31 |
+1 А точнее - если в данный момент работает, то это невезение! |
| Автор: Чучмек 2.7.2012, 00:33 |
На хим. заводе мастером. Про зарплату лучше не спрашивай. |
| Автор: chikistbuch 2.7.2012, 00:36 |
| а я в МЧС Беларуси )))) |
| Автор: MetalFan 2.7.2012, 07:23 | ||
Вредный совет, имхо. Без острой необходимости и четкого представления внутренностей VCL-обертки компонента я бы так делать не порекомендовал. Где гарантия, что у TProgressBar не "сорвет голову" от таких манипуляций? Модератор: Флуд не по теме заканчиваем, если очень хочется, то это можно обсудить в других разделах или личке Добавлено @ 07:25 Почему же оффтопить? Просто не стоит говорить разными терминами "об одном и том же", а то новичка только запутаем. В http://forum.vingrad.ru/index.php?showtopic=353795&view=findpost&p=2501395 я описал механизм работы Synchronize простыми словами. А http://forum.vingrad.ru/forum/topic-60076.html (см. Глава 3. Основы синхронизации. Решение для Delphi: TThread.Synchronize.) этот механизм описан более полно, да еще и с картинками. |
| Автор: Чучмек 2.7.2012, 09:43 | ||
Да ничего страшного не будет. Просто не желательно, после этого, использовать такой компонент обычным способом. Будет только несоответствие нескольких внутренних переменных TProgressBar. Самое большое, это FVisible. - желательно восстановить исходную видимость. Можно написать потомка с добавлением реакции на какое-нибудь сообщение,и через это сообщение передавать изменение состояния, тогда точно никаких проблем не будет. |
| Автор: northener 3.7.2012, 01:21 | ||
В моём понимании это и есть оффтопить. Точнее "устраивать терминологический спор" вокруг простого вопроса новичка. Именно этим спором мы только ему только помешаем. А как вы предполагаете "не говорить разными терминами "об одном и том же""? Это же не азбука и даже не арифметика. Вы изучали данную тему по одной книге/статье и т.п. Я по другой. P.S. Когда я с этим знакомился, не было не только перевода Бориса, но и не было самой той книги. |
| Автор: MetalFan 3.7.2012, 13:03 | ||
Утверждение неверно - это факт. |
| Автор: northener 4.7.2012, 00:10 | ||
Дабы не допустить холивар в тематической ветке соглашусь, что я был не прав в степени категоричности данного своего утверждения. Приношу всем свои извинения за это. P.S. Если на Винграде есть специальное место для холиваров и если кто-то захочет продолжить этот спор, то только скажите где и когда. |
| Автор: chikistbuch 4.7.2012, 07:26 | ||
))))))))))))))) |