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

Вниз

Thread and ADOQuery   Найти похожие ветки 

 
owl_of_fear   (2004-03-18 11:41) [0]

как сие можно реализовать ?

просто идея такая, что бы незаметно от пользователя ,
в "фоне" рефрешилась таблица ,так как приложение
рантайм и это вызывает некоторые неудобства ...


 
sniknik ©   (2004-03-18 11:48) [1]

шофер и машина

как сие можно реализовать ?

просто идея такая, что бы незаметно от пассажира ,
в "бессознанке" оссушествлялся траффик ,так как машина
грузовая это вызывает некоторые неудобства ...


 
owl_of_fear   (2004-03-18 12:43) [2]

Да я имею ввиду как правильно реализовать это ?

пока есть только это
так прикинул

class TThrQuery : public TThread
{
private:
  TADOQuery * FADOQuery;
public:
  __fastcall TThrQuery(TADOQuery *ADOQuery):TThread(false)
  {
     try
     {
        FADOQuery = ADOQuery;
     }
     catch(Exception &e)
     {
       ShowMessage("Err.. in constructor " + e.Message);
     }
  }
public:
  virtual void __fastcall Execute()
  {
    try
     {
       FADOQuery->Close(); // Вот сдесь выскакивает ошибка
       FADOQuery->Open();
     }
    catch(Exception &e)
     {
       ShowMessage("Err in proc. Execute " + e.Message);
     }
  }
};


А ошибка такая :

"Нельзя это сделать на открытый DataSet",
но тогда я задаю вопрос а на кой я его закрываю ?
или вот это все  

 FADOQuery->Close();
 FADOQuery->Open();

завернуть тоже в процедуру ?


 
sniknik ©   (2004-03-18 12:58) [3]

правильнее пользоватся встреным в ADO потоком, который запускается по eoAsyncExecute в опциях.
(личное ни к чему не обязывающее мнение)

по поводу ошибки информации недостаточно. тут даже не видно а создается ли вообще компанент, или может видно но я сипп не понимаю:(
ситуацию с передачей в поток кверей извне потока даже рассматривать не хочу, буду думать это у меня видения. ;о)


 
JibSkeart_   (2004-03-18 13:11) [4]

Ну вот пример


TThrQuery * thr ;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  thr = new TQueryOC(ADOQuery1);  
//на делфях будет выглядеть так thr:=TQueryOC.Create(ADOQuery1);

  thr->Execute(); // thr.Execute;
}


Хмм, а может просто получаются пересечения ?

если несколко раз быстро нажать на кнопарь то такая ошибка и получается и еще другие :)

да  а можещь по подробнее по поводу eoAsyncExecute ?
А в моем же случае почему я выбрал TThread это то что
помимо ADOQuery->Close/Open параллельно еще хочу запускать
еще кое что .


 
JibSkeart_   (2004-03-18 13:38) [5]

переписал так

void __fastcall CloseOpen()
{
if (FADOQuery->Active)
      {
        FADOQuery->Active = false;
        FADOQuery->Active = true;
      }
}
virtual void __fastcall Execute()
 {
   try
    {
     CloseOpen()
    ...
 }  


Все стало ок !


 
sniknik ©   (2004-03-18 13:46) [6]

JibSkeart_   (18.03.04 13:11) [4]
представляю как это выглядит, но вот трудно представить как это работает (компанент в основном потоке а вызовы к нему из потока)

JibSkeart_   (18.03.04 13:38) [5]
может потому что сипп автоматом для методов обертку в Synchronize делает?


 
JibSkeart_   (2004-03-18 13:54) [7]


представляю как это выглядит, но вот трудно представить как это работает (компанент в основном потоке а вызовы к нему из потока)


Ну да в Делфях это бы немного по другому выглядело .


может потому что сипп автоматом для методов обертку в Synchronize делает?


Вот этого не знаю ...
а что за обертка такая Synchronize ?
что то не встречал такого , а может просто ужо не помню .


 
sniknik ©   (2004-03-18 14:39) [8]

все вызовы и все обращения к данным в одном потоке из другого должны делатся через Synchronize (синхронизация с основным, это в основном при обращении к основному потоку), или через сообщения или с блокировкой (CriticalSection).
нужно в основном для того чтобы разные потоки не использовали данные одновременно - грозит многими неприятностями от тормозов до AV.

особенно наглядно при обращении из потока к визуальным компанентам (на основной форме к примеру)... опять мог бы посоветовать проверку (из потока к Label.Font обратится(изменить)... всегда зависание почемуто) но вот не уверен, это вообщето "болезнь" VCL, а в сипп есть VCL?
может оно(что есть) там у вас потокобезопасно, а я тут буду говорить что так нельзя делать...
можеш попробовать, повиснет (в чем я почти не сомневаюсь) значит нельзя. тогда и передавать
thr = new TQueryOC(ADOQuery1);
нельзя. передается то указатель, который и в основном доступен... пересечения неизбежны (если конечно метод в котором он используется не синхронизирован с основным потоком, о чем и пердположение было).


 
JibSkeart_   (2004-03-18 14:49) [9]

Я же юзаю BC++ конечно в нем VCL
да действительно ,
я что то стормозил по поводу Synchronize

сейчас буду эксперементировать с ним .
тобищь можtт попробовать Synchronize(CloseOpen);

А такая вещь thr = new TQueryOC(ADOQuery1);
не зависает но AV выскакивает иммено из-за пересечений ..


 
KSergey ©   (2004-03-18 15:04) [10]

Я вот это не понял:

> JibSkeart_   (18.03.04 13:11) [4]
>   thr = new TQueryOC(ADOQuery1);  
>   thr->Execute(); // thr.Execute;

Создаем потоковый объект, и тут же зачем-то вызываем его Execute?? Это что еще за бред? Может книжки почитать? Execute вызовется создавшимся потоком ОС.
Далее. В конструктор передается ссылка на экземпляр ADOQuery. Я правда не смог просечь гдеу вас происходит вызов конструктора родителя и происходит ли он вообще, но имейте в виду, что как только он будет вызван с FALSE - тут же начнет выполняться поток! Т.е. даже до окончания конструирования СиБилдеровского объекта! Т.е. вызовется Execute, и к этому дано быть готовым, т.е. все используемые в нем ссылки должны быть к этому моменту уже заполнены.

> тобищь можtт попробовать Synchronize(CloseOpen);

Ага, и второй поток будет в основном занят тем, что ждать когда отработает Synchronize в рамках основного. А на кой он тогда нужен? Чтобы жисть сахаром не казалась? ;)


 
JibSkeart_   (2004-03-18 15:19) [11]

2KSergey ©   (18.03.04 15:04) [10]

Взгляни на это  или точнее на мой 2 пост
TQueryOC это класс унаследованный от TThread

 Сдесь переопределение конструктора TThread
 
 
 __fastcall TThrQuery(TADOQuery *ADOQuery):TThread(false) аналог         в Делфи   inherited Create(False);
 {
    try
    {
       FADOQuery = ADOQuery;    передаю указатель ...
    }
    catch(Exception &e)
    {
      ShowMessage("Err.. in constructor " + e.Message);
    }
 }

 virtual void __fastcall Execute() <-!!!!
 {
   try
    {
      FADOQuery->Close();
      FADOQuery->Open();
    }
   catch(Exception &e)
    {
      ShowMessage("Err in proc. Execute " + e.Message);
    }
 }

Вы хотите сказать что метод Execute выполняется автоматически ,
при создании обекта (в моем случае thr) ?

или что ты имеешь ввиду ?


 
KSergey ©   (2004-03-18 15:33) [12]

> JibSkeart_   (18.03.04 15:19) [11]
>  __fastcall TThrQuery(TADOQuery *ADOQuery):TThread(false)
> аналог         в Делфи   inherited Create(False);

> Вы хотите сказать что метод Execute выполняется автоматически,
> при создании обекта (в моем случае thr) ?

Мы хотим сказать, что я знаю ;), что именно во время выполнения родительского конструктора (если он вызван с параметром FALSE)произойдет создание объекта ОС theard, в рамках которого вызовется метод Execute. Почитайте книжки и примеры ;)
Что характеро, к этому моменту ссылка в FADOQuery может быть еще не перенесена (т.е. это выполняется в основном потоке).
И еще
Если ADOQuery подключены к ADOConnection, который работает в основном потоке - это опять же равносильно страшным глюкам из-за несинхронного обращения к нему ADO-объектов из разных потоков. Я сам на это напоролся.

Чес. слово - прислушайтесь к первм строкам из sniknik ©   (18.03.04 12:58) [3]


 
JibSkeart_   (2004-03-18 15:33) [13]

А я понял свою ошибку ...

все правильно так и есть Execute автоматом выполняется :)


 
KSergey ©   (2004-03-18 15:35) [14]

Правда пока готовил, пост JibSkeart_   (18.03.04 15:33) [13] уже подоспел, но уж опубликую, раз старался ;)

> JibSkeart_   (18.03.04 15:19) [11]
>  __fastcall TThrQuery(TADOQuery *ADOQuery):TThread(false)
> аналог         в Делфи   inherited Create(False);

> Вы хотите сказать что метод Execute выполняется автоматически,
> при создании обекта (в моем случае thr) ?

Мы хотим сказать, что я знаю ;), что именно во время выполнения родительского конструктора (если он вызван с параметром FALSE)произойдет создание объекта ОС theard, в рамках которого вызовется метод Execute. Почитайте книжки и примеры ;)
Что характеро, к этому моменту ссылка в FADOQuery может быть еще не перенесена (т.е. это выполняется в основном потоке).
И еще
Если ADOQuery подключены к ADOConnection, который работает в основном потоке - это опять же равносильно страшным глюкам из-за несинхронного обращения к нему ADO-объектов из разных потоков. Я сам на это напоролся.

Чес. слово - прислушайтесь к первм строкам из sniknik ©   (18.03.04 12:58) [3]


 
KSergey ©   (2004-03-18 15:36) [15]

Опс... глюки на сервере.. недоглядел, что уже есть..


 
JibSkeart_   (2004-03-18 15:39) [16]

Понятно учтем ,

Но как  сделать что бы во время рефрешов
второстепенных таблиц не подвисало приложение ,
а точнее не мешало при работе главной таблицы ?
DisableContrls/EnableControls как то не очень то и спасает :(

eoAsyncExecute меня может в этом случае выручить ?


 
JibSkeart_   (2004-03-18 15:40) [17]

Понятно учтем..

Но как  сделать что бы во время рефрешов
второстепенных таблиц не подвисало приложение ,
а точнее не мешало при работе главной таблицы ?
DisableContrls/EnableControls как то не очень то и спасает :(

eoAsyncExecute меня может в этом случае выручить ?


 
JibSkeart_   (2004-03-18 15:42) [18]

Точно

:)))


 
KSergey ©   (2004-03-18 16:03) [19]

> JibSkeart_   (18.03.04 15:40) [17]
> eoAsyncExecute меня может в этом случае выручить ?

На сколько я понимаю - безусловно (воттолько eoAsyncExecute или eoAsyncFetch - надо экспериментировать), вот только не совсем знаю что будет в случае, когда эти "вспомогательные таблицы" есть иснова для Lookup полей.. Пробовать надо


 
_Н_л   (2004-03-18 16:20) [20]

eoAsyncExecute -Abnormal Terminated

eoAsyncFetch  что то там с connection busy

Ужас ...


 
JibSkeart_   (2004-03-18 16:22) [21]

eoAsyncExecute -Abnormal Terminated

eoAsyncFetch  что то там с connection busy

Ужас ...

Блин а что так жутко серевер глючит ?


 
JibSkeart ©   (2004-03-19 11:47) [22]

И то и другое дало ужастные результаты ...
Если в первом случае на стадии загрузки проги вылетает с
"Abnormal terminated"
то во втором случае ,
просто через некоторое время вистнет и все ...



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.037 c
8-1072686282
r00t
2003-12-29 11:24
2004.04.18
Использование wav файлов в стеганографии.


1-1080713994
DimonNew
2004-03-31 10:19
2004.04.18
HTML средствами Delphi


7-1077320098
Electon
2004-02-21 02:34
2004.04.18
Использование чужой DLL


3-1079438056
V-A-V
2004-03-16 14:54
2004.04.18
Просмотр парадоксовских таблиц


8-1073010809
Saimon
2004-01-02 05:33
2004.04.18
Прозрачность формы в Win9x.