Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.046 c
7-1076701580
Khabibulin
2004-02-13 22:46
2004.04.18
Спящий режим


3-1079872042
Vilux
2004-03-21 15:27
2004.04.18
Ado и многопоточность


1-1080551959
Basilio
2004-03-29 13:19
2004.04.18
Автоматические генераторы анализаторов


6-1076491996
Iks
2004-02-11 12:33
2004.04.18
Отправить письмо со вложенной ссылкой ???


1-1080979504
NIK57
2004-04-03 12:05
2004.04.18
Не работает прога без установки Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский