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

Вниз

Ошибка в выполнении параллельного потока   Найти похожие ветки 

 
ANB ©   (2006-11-08 13:30) [80]


> ГореПрограммер   (08.11.06 13:21) [79]

1. ИМХО ты доп.поток умудряешься 2 раза запустистить. покажи код запуска потока.
2. Пока доп поток работает - чего главный делать то должен ? Если он без данных, загруженных доп.потоком работать не может - то лучше глянуть в сторону асинхронки, понадежнее будет.


 
Сергей М. ©   (2006-11-08 13:31) [81]


> один единственный параллельный, который как раз подгружает
> эти данные


Раз ты убрал все это хозяйство в Synchronize(), то отныне та самая твоя "подгрузка" осуществляется в основном потоке !

В чем тогда смысл использования параллельного потока ? Ни в чем. Его можно смело выбросить в мусор.


 
Сергей М. ©   (2006-11-08 13:33) [82]

И (см. [80]) подозреваю, что у тебя фигурирует такой код :

MyThread := TLoadfon.Create(...);
MyThread.Execute;

?


 
ANB ©   (2006-11-08 13:34) [83]


> В чем тогда смысл использования параллельного потока ? Ни
> в чем.

Это типа - помудохаться. Ибо круто и модно.


 
ГореПрограммер   (2006-11-08 13:46) [84]


> Раз ты убрал все это хозяйство в Synchronize(), то отныне
> та самая твоя "подгрузка" осуществляется в основном потоке
> !
>
> В чем тогда смысл использования параллельного потока ? Ни
> в чем. Его можно смело выбросить в мусор.

Я же писал в первом посте темы что именно мне нужно...
Мне необходимо именно фоном, не мешая работе программы выполнить код, который я предоставлял.

> MyThread := TLoadfon.Create(...);
> MyThread.Execute;

Неоднократно уже писал код запуска ) нет там такого.


 
Anatoly Podgoretsky ©   (2006-11-08 14:10) [85]

> ГореПрограммер  (08.11.2006 13:21:19)  [79]

По твоим словам, который запускается много раз вместо одного.


 
Anatoly Podgoretsky ©   (2006-11-08 14:11) [86]

> Сергей М.  (08.11.2006 13:33:22)  [82]

Все гадания.


 
Anatoly Podgoretsky ©   (2006-11-08 14:13) [87]

> ANB  (08.11.2006 13:34:23)  [83]

А зря, я в последнем проекте долго думал, прежде чем использовать потоки, хотя там мог обойтись и без них и с более высокой надежностью. Пришлось также ограничить возможность запуска одноименного потока, для это организовал пул потоков. Каждый запускается только один раз, при повторном запуске не сможет.


 
Anatoly Podgoretsky ©   (2006-11-08 14:13) [88]

> ГореПрограммер  (08.11.2006 13:46:24)  [84]

Уже 84 сообщения и ты сто процентов менял код, поэтому говорить о каком то неизвестном коде нет смысла.


 
ANB ©   (2006-11-08 14:16) [89]

Для начинающих медленно и 2 раза :


Creates an instance of a thread object.

constructor Create(CreateSuspended: Boolean);

Description

Call Create to create a thread in an application. If CreateSuspended is False, Execute is called immediately. If CreateSuspended is True, Execute won’t be called until after Resume is called.


 
ANB ©   (2006-11-08 14:18) [90]

Соответственно код :
tloadfon.create(false);
заставит поток запустится 1 раз
а
tloadfon.Resume - второй.


 
ГореПрограммер   (2006-11-08 14:19) [91]

 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:26) [92]


> ГореПрограммер   (08.11.06 14:19) [91]

а теперь еще неплохо было бы код procedure sinform запостить. Кистате,
procedure tloadfon.Execute;
var i:integer;
begin
FreeOnTerminate := True; // Тута, имхо, смысла не имеет. Хотя мастера поправят, если не так.
И


 
ГореПрограммер   (2006-11-08 14:27) [93]


> а теперь еще неплохо было бы код procedure sinform запостить.
>  Кистате,

он там написан.


 
Сергей М. ©   (2006-11-08 14:29) [94]


> ANB ©   (08.11.06 14:18) [90]
>
> Соответственно код :
> tloadfon.create(false);
> заставит поток запустится 1 раз
> а
> tloadfon.Resume - второй.
>


Ну ерунду же несешь)


> ГореПрограммер   (08.11.06 14:19) [91]


Ну и какого ляда ты опять обращаешься к виз.объектам без синхронизации ?


 
ANB ©   (2006-11-08 14:34) [95]


> ГореПрограммер   (08.11.06 14:27) [93]

А. точно. слилось - не заметил.

fstart.prog1.Position:=0;
fstart.stat.Panels[0].Text:="Все данные загружены";

вот это тоже желательно синхронизить.

И где то ты его сам еще раз стартуешь - чудес не бывает. Смотри весь код.
Для очистки совести скинь лог в файл. И время выстави. Тока сообщения поставь в начале execute, в конце и в теле цикла.


 
Anatoly Podgoretsky ©   (2006-11-08 14:57) [96]

> ГореПрограммер  (08.11.2006 14:19:31)  [91]

Весь код крутится в контексте главного потока, отсюда выводы

1. читал Архангельского
2. потоки не нужны.


 
Anatoly Podgoretsky ©   (2006-11-08 14:58) [97]

> ANB  (08.11.2006 14:26:32)  [92]

Не только, вот это ar_excel.zaps похоже на свойство, а оно может быть контролируемым.


 
Anatoly Podgoretsky ©   (2006-11-08 14:59) [98]

> ГореПрограммер  (08.11.2006 14:27:33)  [93]

Зато есть loadip


 
Anatoly Podgoretsky ©   (2006-11-08 15:01) [99]

> ANB  (08.11.2006 14:18:30)  [90]

> tloadfon.Resume - второй.

в приведеном обрывке кода не наблюдается


 
ГореПрограммер   (2006-11-08 15:09) [100]


> вот это тоже желательно синхронизить.
>
> И где то ты его сам еще раз стартуешь - чудес не бывает.
>  Смотри весь код.

убрал, добавил в синхронизацию

> И где то ты его сам еще раз стартуешь - чудес не бывает.
>  Смотри весь код.

если из синхронизации убрать функции выборки из базы, все выполняется корректно и один раз.

> 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

Так он и был раньше


 
Сергей М. ©   (2006-11-08 15:13) [101]


> ГореПрограммер   (08.11.06 15:09) [100]
>
>


Ты вообще понимаешь, что такое в дан.контексте "синхронизация" и что при оной происходит ?

Объясни своими словами, если понимаешь ...


 
ANB ©   (2006-11-08 15:15) [102]


> Тогда очередной глупый вопрос:
> каким образом реализовать фоновую загрузку данных из базы
> ?

А зачем ее делать в отдельном потоке, если достаточно маленькими кусочками и Application.ProcessMessages ?


 
Сергей М. ©   (2006-11-08 15:22) [103]


> ANB ©   (08.11.06 15:15) [102]


Опять же ерунду городишь.

Не всякая СУБД реализует асинхронные режимы, поэтому использование доп.потоков в ряде случаев вполне оправдано


 
ГореПрограммер   (2006-11-08 15:22) [104]


> Ты вообще понимаешь, что такое в дан.контексте "синхронизация"
> и что при оной происходит ?
>
> Объясни своими словами, если понимаешь ...

На сколько я понимаю это синхронизация методов текущего потока с главным VCL потоком.


 
Сергей М. ©   (2006-11-08 15:25) [105]


> ГореПрограммер   (08.11.06 15:22) [104]



> На сколько я понимаю это синхронизация методов текущего
> потока с главным VCL потоком


Не подлежит сомнению.

А что собственно происходит при этом ? Вот в чем вопрос к тебе ...


 
ANB ©   (2006-11-08 16:12) [106]


> Сергей М. ©   (08.11.06 15:22) [103]

А асинхронка нужна далеко не всегда, если запрос оптимизен, то больше времени уходит на перекачку ответов. Вот этот перебор и разбить на кусочки.


 
ANB ©   (2006-11-08 16:14) [107]

А авторские запросы вообще есть смысл запихать в один, да заодно и параметризировать. И асинхронка/потоки не нужны будут.


 
Сергей М. ©   (2006-11-08 16:19) [108]


> ANB ©   (08.11.06 16:12) [106]


> асинхронка нужна далеко не всегда


"нужна", "не нужна" .. "оптимизен", "не оптимизен"

НЕТ ничего этого, предположим) ... СУБД не позволяет)

Что дальше ?

Дальше - копание могилы в виде доп.потоков)


 
ANB ©   (2006-11-08 17:37) [109]


> СУБД не позволяет)

СУБД не позволяет грамотно проектировать БД и оптимизить запросы, чтобы они не грузились по полчаса ?



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

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

Наверх




Память: 0.67 MB
Время: 0.034 c
15-1162662751
gotik21
2006-11-04 20:52
2006.11.26
Как вам такие цены


15-1162731090
Palladin
2006-11-05 15:51
2006.11.26
Аналог Орешника


1-1160956124
Муха
2006-10-16 03:48
2006.11.26
Смена курсора


6-1151929209
dreamse
2006-07-03 16:20
2006.11.26
Как загрузить с HTTP информацию текстовую из файла ?


1-1161084458
Trajor!
2006-10-17 15:27
2006.11.26
Interleaved 2 of 5