Форум: "Базы";
Текущий архив: 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