![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| chikistbuch |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
Всем привет.
Пишу все в unit1.
Процедура loaddata запускается и выполняется, а вот форма в это время висит. про потоки читал здесь: http://callipso.bestcode.org/delphi/artical/num2.html |
||||
|
|||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
loaddata с формой взаимодействует?
Наверняка, иначе зачем тогда Synchronize? Вот Synchronize и блокирует основной поток, наверно. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| chikistbuch |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
А как сделать чтобы не блокировала? Пускай sql сформирую в потоке
а как обратно передать значение sql в loaddata и дождаться выполнение TPotok.createSQL, а то пишет что SQL пуст |
||||
|
|||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Попробуй повтыкать Application.ProcessMessages();
|
|||
|
||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Посмотри в чем разница
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Верно подметил. Использовать поток только для того, чтобы в нем сразу вызвать Synchronize - бессмысленно. -------------------- There are always someone smarter than you... |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Синхронайз ничего не блокирует. Но все что выполняется внутри Synchronize выполняется в основном потоке. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Ну здрасти?! а как он тогда работает? Блокируется поток, вызвавший Synchronize, затем когда доходит дело до выполнения кода процедуры, отданной в Synchronize, основной поток занимается ее выполнением... соотв.ничего более в осн.потоке не работает., после того, как код процедуры отрабатывает в основном потоке, доп.поток продолжает работу. Ну и осн.поток продолжает заниматься своими делами. Это сообщение отредактировал(а) MetalFan - 29.6.2012, 16:49 -------------------- There are always someone smarter than you... |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Ну собственно я отвечал на -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Ну и вдогонку.
Ну не "блокируется" этот поток! Он продолжает выполняться в соответствии со своим кодом. Но войдя в Synchronize код этого потока выполняется не в нём самом, а в основном потоке приложения. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 2 Всего: 4 |
Как раз таки нет: поток переходит в состояние suspend, а управление передаётся основному потоку. Когда нужная функция отработает в основном потоке, вызывающий поток опять получает процессорное время и продолжает свою работу. |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Это уже похоже на спор о терминологии. Говорим одно и то же, но предпочитаем использовать разные термины. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 2 Всего: 4 |
Говорим совсем о разном. Попробую объяснить по другому:
При вызове Synchronize, вызывающий поток переходит в состояние suspend, т.е. ему перестает выделятся процессорное время, т.е. он блокируется. По вашем описанию похоже, что вы думаете, что на момент выполнения Synchronize этот поток на время становится главным или что-то в этом роде, так как у меня нету предположений как он может не блокироваться и в этот же момент не выполнятся. |
|||
|
||||
| chikistbuch |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
нихера не получается
|
|||
|
||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
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, 14:29 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |