Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизПотоки и формы Найти похожие ветки
← →
P_Aleks © (2004-04-27 16:16) [0]Здравствуйте!
Перейду сразу к вопросу:
Народ, Никто не пытался приделать к форме свой thread? Т.е
Tread должен обрабатывать все оконные сообщения формы. Это может быть очень полезно ,например, при массовом выводе из БД.
← →
evvcom © (2004-04-27 16:18) [1]А чем первичный поток не нравится?
← →
Digitman © (2004-04-27 16:27) [2]
> P_Aleks © (27.04.04 16:16)
форма - объект VCL, трэд - объект ОС
"приделать" - понятие растяжимое
← →
P_Aleks © (2004-04-27 16:28) [3]Вывожу много информации на несколько форм из бд.
Тред занимается тем ,что вызывает Synchronize для каждой строки из Dataset. Теперь если попытаться прибить одну из многих форм,
то интерфейс виснет на некоторое время. Я так думаю ,
что vcl не успевает вовремя прибить форму.
← →
Digitman © (2004-04-27 16:30) [4]
> Тред занимается тем ,что вызывает Synchronize для каждой
> строки из Dataset
ерундой он у тебя занимается
← →
P_Aleks © (2004-04-27 16:30) [5]Digitmanу Vcl он или или не Vcl а работает в конечном счете с тем же CreateWindow. И события обрабатывает в том же цикле.
← →
Тимохов © (2004-04-27 16:33) [6]
> конечном счете с тем же CreateWindow.
а вы знакто winapi, как я погляжу.
Может вам свою vcl написать - aleksVCL?
И события обрабатывать в том же цикле?
← →
P_Aleks © (2004-04-27 16:42) [7]Всётаки не до конца понятна агрессивная реакция Уважаемых.
А как лучше сделать выборку из бд, так чтобы User мог управлять процессом. И чем плох "Synchronize для каждой строки из Dataset" ?
← →
Тимохов © (2004-04-27 16:45) [8]
> P_Aleks © (27.04.04 16:42) [7]
> Всётаки не до конца понятна агрессивная реакция
Если у тебя, что-то притормаживает, значит ты неверно делаешь synchronize. Например, в методе который ты передаешь в synchronize выполняется долгая работа, которая естественно делается в главном потоке. Если же ты продолжаешь утвержать, что через synchronize выводятся только результаты, то тогда хорошо бы видеть код...
← →
Mim1 © (2004-04-27 16:46) [9]> И чем плох "Synchronize для каждой строки из Dataset" ?
Дайте попробую угодать, тем что программа виснет :).
Сформируйте данные в масив, и передайте за один раз не вызывая этого метода для каждой из строк.
← →
Digitman © (2004-04-27 16:48) [10]
> "Synchronize для каждой строки из Dataset"
это вообще зачем ? поясни ...
imho, дурь ...
← →
P_Aleks © (2004-04-27 16:48) [11]>Mim1 Сформируйте данные в масив, и передайте за один раз не вызывая этого метода для каждой из строк
Тогда Юзер не будет видеть процесс вывода(и не сможет его прервать). А он модет занять длительное время.
← →
Тимохов © (2004-04-27 16:52) [12]
> P_Aleks © (27.04.04 16:48) [11]
А чем не удовлетворяет progressbar?
пользователь видет, что вывод идет.
Или ему нужно выдеть именно данные в строках?
Но это же ерунда какая-то - пользователи должны быть роботами Верторами, чтобы с уметь оценить инфу, которая перед ними мелькает и понять, что что-то их не удовлетворяет и решить прервать запрос.
← →
P_Aleks © (2004-04-27 16:52) [13]>Digitman это вообще зачем
Synchronize на добавление в какой нибудь отчет (listview, VirtualtreeView).Eсли добалять напрямую, то получаем проблемы совместного доступа потоков. По CriticalSession тоже не стоит,
я не смогу перекрыть все обращения к этим отчетам.
← →
Digitman © (2004-04-27 16:52) [14]
> P_Aleks
тебе, кажется , неведомо, что есть "курсор НД"
твой вопрос в "Базы данных" следовало размещать, там тебя научат ..
до потоков тебе еще - как до Китая
← →
Тимохов © (2004-04-27 16:54) [15]добавляй порциями - по 100 штук.
← →
Digitman © (2004-04-27 16:57) [16]
> P_Aleks
начерта юзеру контролировать ход формирования данных отчета ?
пусть НД, на базе которого д.б. сгенерирован отчет, будет сформирован в отдельном треде, а уж ПОЛНЫЙ результат передан механизму генерации отчета в осн.потоке ... и никакой синхронизации не требуется в этоми случае
← →
P_Aleks © (2004-04-27 17:00) [17]Тимохов> Если у тебя, что-то притормаживает, значит ты неверно делаешь synchronize
Сам вывод быстрый.
Но когда я пытаюсь прибить одну из 5-10 форм(тестирую), которая в свою очередь прибивает свой поток вывода из бд
(
FFilltread.Terminate;
FFilltread.WaitFor;
FFilltread.Free;
)
Происходит некоторая пауза, но программа не виснет.
Пауза явно больше чем положено по waitfor(Поток по terminate почти сразу выходит).
← →
Тимохов © (2004-04-27 17:03) [18]а вы знаете сколько положено висеть waitfor - он может висеть бесконечно.
может вам не ждать его окончания?
Т.е. просто termiante и пошли дальше (только поставить freeonterminate := true).
← →
P_Aleks © (2004-04-27 17:12) [19]Тимохов> просто termiante и пошли дальше
Это я уже пробовал. - тот же результат.
Поток себя прибивает а форма висит еще некоторое время.
Думаю придется серьезно менять прогу. Видимо так не стоит делать.
Попробую идею Digitman с кешем.
Спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.064 c