![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в выполнении параллельного потока [D2005, XP]
ГореПрограммер © (2006-11-07 12:51:00)Здравствуйте.
есть клас:
Tloadfon = class(TThread)
protected
procedure sinform;
procedure Execute; override;
end;
procedure tloadfon.sinform;
begin
fstart.prog1.StepIt;
end;
procedure tloadfon.Execute;
var i:integer;
begin
FreeOnTerminate := True;
for i := 0 to ar_excel.count - 1 do
begin
if Terminated then
Break;
loadip(ar_excel.zaps[i].mac,i);
getminup(ar_excel.zaps[i].id);
Synchronize(sinform);
end;
end;
В момент обращения к нему, т.е.
tloadfon.create(false);
выдается ошибка базы данных:
dbExpress Error: Unknown Error Code '256'
[0x0005]: Operation Not Supported
Database Server Error: Failed to query the server.(Error "2013"; Reason "Lost connection to MySQL server during query")
если выполнять функции loadip и getminup не в этом потоке, а просто в программе, то никаких ошибок не происходит. Подскажите пожалуйста где искать ошибку ?
ANB (2006-11-08 17:37:00) [1]
> СУБД не позволяет)
СУБД не позволяет грамотно проектировать БД и оптимизить запросы, чтобы они не грузились по полчаса ?
Сергей М. (2006-11-08 16:19:00) [2]
> ANB © (08.11.06 16:12) [106]
> асинхронка нужна далеко не всегда
"нужна", "не нужна" .. "оптимизен", "не оптимизен"
НЕТ ничего этого, предположим) ... СУБД не позволяет)
Что дальше ?
Дальше - копание могилы в виде доп.потоков)
ANB (2006-11-08 16:14:00) [3]А авторские запросы вообще есть смысл запихать в один, да заодно и параметризировать. И асинхронка/потоки не нужны будут.
ANB (2006-11-08 16:12:00) [4]
> Сергей М. © (08.11.06 15:22) [103]
А асинхронка нужна далеко не всегда, если запрос оптимизен, то больше времени уходит на перекачку ответов. Вот этот перебор и разбить на кусочки.
Сергей М. (2006-11-08 15:25:00) [5]
> ГореПрограммер (08.11.06 15:22) [104]
> На сколько я понимаю это синхронизация методов текущего
> потока с главным VCL потоком
Не подлежит сомнению.
А чтособственно происходит при этом ? Вот в чем вопрос к тебе ...
Сергей М. (2006-11-08 15:22:00) [6]
> ANB © (08.11.06 15:15) [102]
Опять же ерунду городишь.
Не всякая СУБД реализует асинхронные режимы, поэтому использование доп.потоков в ряде случаев вполне оправдано
ГореПрограммер (2006-11-08 15:22:00) [7]
> Ты вообще понимаешь, что такое в дан.контексте "синхронизация"
> и что при оной происходит ?
>
> Объясни своими словами, если понимаешь ...
На сколько я понимаю это синхронизация методов текущего потока с главным VCL потоком.
ANB (2006-11-08 15:15:00) [8]
> Тогда очередной глупый вопрос:
> каким образом реализовать фоновую загрузку данных из базы
> ?
А зачем ее делать в отдельном потоке, если достаточно маленькими кусочками и Application.ProcessMessages ?
Сергей М. (2006-11-08 15:13:00) [9]
> ГореПрограммер (08.11.06 15:09) [100]
>
>
Ты вообще понимаешь, что такое в дан.контексте "синхронизация" и что при оной происходит ?
Объясни своими словами, если понимаешь ...
ГореПрограммер (2006-11-08 15:09:00) [10]
> вот это тоже желательно синхронизить.
>
> И где то ты его сам еще раз стартуешь - чудес не бывает.
> Смотри весь код.
убрал, добавил в синхронизацию
> И где то ты его сам еще раз стартуешь - чудес не бывает.
> Смотри весь код.
если из синхронизации убрать функции выборки из базы, все выполняется корректно и один раз.
> Anatoly Podgoretsky © (08.11.06 14:57) [96]
>
> > ГореПрограммер (08.11.2006 14:19:31) [91]
>
> Весь код крутится в контексте главного потока, отсюда выводы
>
> 1. читал Архангельского
> 2. потоки не нужны.
>
Тогда очередной глупый вопрос:
каким образом реализовать фоновую загрузку данных из базы ?
> Anatoly Podgoretsky © (08.11.06 14:59) [98]
>
> > ГореПрограммер (08.11.2006 14:27:33) [93]
>
> Зато есть loadip
Так он и был раньше
Anatoly Podgoretsky (2006-11-08 15:01:00) [11]> ANB (08.11.2006 14:18:30) [90]
> tloadfon.Resume - второй.
в приведеном обрывке кода не наблюдается
Anatoly Podgoretsky (2006-11-08 14:59:00) [12]> ГореПрограммер (08.11.2006 14:27:33) [93]
Зато есть loadip
Anatoly Podgoretsky (2006-11-08 14:58:00) [13]> ANB (08.11.2006 14:26:32) [92]
Не только, вот это ar_excel.zaps похоже на свойство, а оно может быть контролируемым.
Anatoly Podgoretsky (2006-11-08 14:57:00) [14]> ГореПрограммер (08.11.2006 14:19:31) [91]
Весь код крутится в контексте главного потока, отсюда выводы
1. читал Архангельского
2. потоки не нужны.
ANB (2006-11-08 14:34:00) [15]
> ГореПрограммер (08.11.06 14:27) [93]
А. точно. слилось - не заметил.
fstart.prog1.Position:=0;
fstart.stat.Panels[0].Text:='Все данные загружены';
вот это тоже желательно синхронизить.
И где то ты его сам еще раз стартуешь - чудес не бывает. Смотри весь код.
Для очистки совести скинь лог в файл. И время выстави. Тока сообщения поставь в начале execute, в конце и в теле цикла.
Сергей М. (2006-11-08 14:29:00) [16]
> ANB © (08.11.06 14:18) [90]
>
> Соответственно код :
> tloadfon.create(false);
> заставит поток запустится 1 раз
> а
> tloadfon.Resume - второй.
>
Ну ерунду же несешь)
> ГореПрограммер (08.11.06 14:19) [91]
Ну и какого ляда ты опять обращаешься к виз.объектам без синхронизации ?
ГореПрограммер (2006-11-08 14:27:00) [17]
> а теперь еще неплохо было бы код procedure sinform запостить.
> Кистате,
он там написан.
ANB (2006-11-08 14:26:00) [18]
> ГореПрограммер (08.11.06 14:19) [91]
а теперь еще неплохо было бы код procedure sinform запостить. Кистате,
procedure tloadfon.Execute;
var i:integer;
begin
FreeOnTerminate := True; // Тута, имхо, смысла не имеет. Хотя мастера поправят, если не так.
И
ГореПрограммер (2006-11-08 14:19:00) [19]
Tloadfon = class(TThread)
private
index:integer;
protected
procedure sinform;
procedure Execute; override;
end;
....
procedure tloadfon.sinform;
begin
loadip(ar_excel.zaps[index].mac,index);
ar_excel.zaps[index].firstup:=getminup(ar_excel.zaps[index].id);
fstart.prog1.StepIt;
end;
procedure tloadfon.Execute;
var i:integer;
begin
FreeOnTerminate := True;
for i := 0 to ar_excel.count - 1 do
begin
if Terminated then
exit;
index:=i;
Synchronize(sinform);
end;
fstart.prog1.Position:=0;
fstart.stat.Panels[0].Text:='Все данные загружены';
end;
.....
вызов:
stat.Panels[0].Width:=10;
stat.Panels[0].Text:='Идет подгрузка вспомогательных данных';
prog1.Position:=0;
prog1.Max:=ar_excel.count;
tloadfon.Create(false);
if ar_excel.count>0 then
begin
tabterm.RowCount:=k22+1;
tabterm22.RowCount:=k3-k22+1;
......
ANB (2006-11-08 14:18:00) [20]Соответственно код :
tloadfon.create(false);
заставит поток запустится 1 раз
а
tloadfon.Resume - второй.