Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
3-1193045210
NNH
2007-10-22 13:26
2008.03.09
Обновление запроса UPDATE


15-1201696930
Ega23
2008-01-30 15:42
2008.03.09
Посоветуйте пример


15-1201937868
SKIPtr
2008-02-02 10:37
2008.03.09
Помогите с выбором материнской платы


15-1201723498
Winder
2008-01-30 23:04
2008.03.09
Vista and XP


15-1201944617
Андрей
2008-02-02 12:30
2008.03.09
Браузер файлов на диске