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

Вниз

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

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

Наверх




Память: 0.65 MB
Время: 0.086 c
2-1162968666
LexXL
2006-11-08 09:51
2006.11.26
записать переменную в файл


2-1162826267
312Kbps
2006-11-06 18:17
2006.11.26
Handle and OLE !


15-1162946472
Школьник
2006-11-08 03:41
2006.11.26
Как выглядит уравнение прямой в 3D ?


3-1158678700
*Ray*
2006-09-19 19:11
2006.11.26
авторизация пользователей


15-1163080474
Greenchel
2006-11-09 16:54
2006.11.26
Сохранить текст из Edit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский