Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
ВнизADO внутри потока Найти похожие ветки
← →
patrick1968 © (2008-02-13 18:38) [0]При обработке потока столкнулся с такой проблемой, при открытии запроса оракла через компоненты ADO поток подвисает, вычитал на форуме, что надо делать примерно так
procedure TMainThread.Execute;
begin
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
while not Terminated do
begin
Synchronize(DoWork);
Sleep(1000);
end;
CoUnInitialize;
end;
procedure TMainThread.DoWork;
begin
... вот как раз зависает тут
Unload.OraQuery.Parameters.ParamByName("MX").Value := MX;
Unload.OraQuery.Open;
...
end;
может подскажет кто-нибудь решение проблемы
← →
Ega23 © (2008-02-13 19:36) [1]
> может подскажет кто-нибудь решение проблемы
>
конечно. Не надо читать Архангельского.
while not Terminated do
begin
Synchronize(DoWork);
Sleep(1000);
end;
Как ты думаешь, что тут происходит?
← →
patrick1968 © (2008-02-13 19:43) [2]Дык и так делал - ситуация таже самая
← →
Palladin © (2008-02-13 19:48) [3]а вот не надо так делать... я тебе намекал намекал ознакомиться поподробней, а не тупо копировать... ты так ничего и не понял... доктор сказал в морг значит в морг...
← →
patrick1968 © (2008-02-13 19:54) [4]Имеешь ввиду что Execute у потока также не надо пользовать как и у службы, только в статьях на сей счет противоречивая инфа.
← →
sniknik © (2008-02-13 23:22) [5]> Имеешь ввиду что Execute у потока также не надо пользовать как и у службы
с чего это Execute не использовать? использовать можно все что нужно в нужном месте... в том числе и Execute у службы.
а указывали тебе, выделили Synchronize с DoWork, не делать так как у тебя с ними. только не интерпретируй так что ее вообще нельзя использовать... когда нужно она весьма полезна. но не в таком контексте как у тебя. а вот для того чтобы различать когда нужно, а когда вредно тебе и предлагали подумать(/найти/почитать) о том зачем нужна функция и что с ее вызовом происходит. должен же понимать что пишешь, а не просто набор заклинаний отовсюду в свою прогу копировать...
← →
Германн © (2008-02-14 01:53) [6]
> вычитал на форуме, что надо делать примерно так
>
Это на каком форуме? На нашем форуме это как красная тряпка для быка, который помимо прочего выделяет из всех людей Архангельского и его читателей/последователей.
P.S.
Статью Коли Рариха вроде уже давно убрали с нашего сайта. Или я ошибаюсь?
← →
sniknik © (2008-02-14 08:20) [7]> Статью Коли Рариха вроде уже давно убрали с нашего сайта. Или я ошибаюсь?
вот уж не знал что такая есть... но действительно есть
http://www.delphimaster.ru/articles/http/index.html (ВНИМАНИЕ, в указанной статье работа с потоком идет принципиально неверно. НЕ ИСПОЛЬЗОВАТЬ!!!)
даже сюда при общем нетерпении последователь Архангельского пробрался... :)
← →
ANB (2008-02-14 09:04) [8]
> при открытии запроса оракла через компоненты ADO
Используй нативные способы доступа к ораклу - там есть асинхронное выполнение запроса без доп.потоков.
ИМХО : использование потоков для асинхронного доступа к серверным СУБД - извращение, только маскирующее проблему и создающее доп. сложности. Кстати, можно и АДО покопать, возможно, в нем тоже есть асинхронный режим.
← →
sniknik © (2008-02-14 10:01) [9]> возможно, в нем тоже есть асинхронный режим.
почему только возможно? точно есть. но вопрос конкретно о "ADO внутри потока". а не о том какой лучший способ для ... "делается вот это" ....
← →
patrick1968 © (2008-02-14 11:14) [10]Имеется ввиду свойство ConnectOptions у TADOConnection тоже пробовал менять на coAsyncConnect - результат тот же.
← →
Сергей М. © (2008-02-14 11:17) [11]
> результат тот же
А куда он денется, этот результат, если ты по-прежнему пытаешься воспользоваться вредными советами Архангельского, Кариха и иже с ними ?)
← →
patrick1968 © (2008-02-14 11:44) [12]Вот Palladin тоже так считает, но согластно ссылке, которую он любезно предоставил http://www.delphimaster.ru/articles/panov/index.html
есть такой текст
Execute.
В Execute должен выполняться весь код, который должен выполняться «параллельно» основному потоку. Как правило, если поток предназначен для выполнения многократно повторяющегося кода (цикла), то в Execute используется конструкция следующего вида:
while not Terminated do
begin
// В этом месте выполняется весь необходимый код.
…
// Если здесь необходимо обновлять некоторые данные в основном потоке,
// то здесь используйте метод Synchronize.
Synchronize(MyUpdateProcedure);
// Процедуру MyUpdateProcedure определяем в описании нашего класса.
end;
Synchronize
Так как процедура, вызываемая в методе Synchronize выполняется в основном потоке, то на время выполнения Synchronize главная форма будет блокирована для ввода, обновления информации, как это происходит при длительных операциях в основном потоке.
Поэтому этот метод надо вызывать по возможности реже.
Простейший пример таймера:
procedure MyThread.MyUpdateProcedure;
begin
FormMain.LabelCounter.Caption := IntToStr(FCounter);
end;
procedure MyThread.Execute;
begin
while not Terminated do
begin
Inc(FCounter);
Synchronize(MyUpdateProcedure);
Sleep(1000);
end;
end;
Если Вам необходимо из потока обновлять переменные и объекты, которые используются вне этого потока, всегда пользуйтесь методом Synchronize. Результат обновления прямо из Execute или других процедур, определенных в потоке, может быть непредсказуемым, вплоть до возникновения исключительной ситуации(Exception)
Так вот - это вредные советы или нет?
← →
Сергей М. © (2008-02-14 11:52) [13]
> это вредные советы или нет?
При бездумном чтении статьи и бездумном же передирании примера в свой код - безусловно, вредные.
Именно это ты и продемонстрировал)
← →
sniknik © (2008-02-14 11:55) [14]> Так вот - это вредные советы или нет?
это нормальные. правильные, и понятные... в них описана цель. и показано как/чем она достигается.
← →
Сергей М. © (2008-02-14 11:58) [15]Если Вам необходимо из потока обновлять переменные и объекты, которые используются вне этого потока, всегда пользуйтесь методом Synchronize
Вот это очень вредный совет.
← →
patrick1968 © (2008-02-14 12:03) [16]Как вас понимать?
← →
Сергей М. © (2008-02-14 12:05) [17]Прямо так и понимай - ты содрал код из примера, ни секунды не задумываясь над происходящем в этом коде.
← →
sniknik © (2008-02-14 12:06) [18]аналогия...
не заводится машина, ктото советует "а давайте толканем", толканули, завели поехали... в автомастерскую. :)
а ты на это смотришь и решаешь "о, а нафига на бензин тратиться? а давай ка я буду ездить толканием"...
и? предыдущий совет про "толканем" будет вредным? или неверно исключительно твое понимание для чего его использовать?
← →
Сергей М. © (2008-02-14 12:14) [19]
> patrick1968 © (14.02.08 12:03) [16]
Да и, собственно, совет вынести работу с ADO в доп.поток, который тебе был дан по поводу предыдущего твоего вопроса по сервису, тоже можно считать вредным, ибо ты не осознаешь, для чего оно тебе надо.
← →
Германн © (2008-02-14 13:21) [20]
> sniknik © (14.02.08 08:20) [7]
>
> > Статью Коли Рариха вроде уже давно убрали с нашего сайта.
> Или я ошибаюсь?
> вот уж не знал что такая есть... но действительно есть
> http://www.delphimaster.ru/articles/http/index.html (ВНИМАНИЕ,
> в указанной статье работа с потоком идет принципиально
> неверно. НЕ ИСПОЛЬЗОВАТЬ!!!)
> даже сюда при общем нетерпении последователь Архангельского
> пробрался... :)
Ууу, блин. А про эту статью я и не знал. Я то говорил про статью посвященную именно работе с потоками, которая довела цифрочеловека до ручки. Её действительно давно убрали.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c