Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в выполнении параллельного потока [D2005, XP]


Страницы:   1 2 3 4 5 6

ГореПрограммер ©   (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 - второй.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо