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

Вниз

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

 
ГореПрограммер   (2006-11-07 12:51) [0]

Здравствуйте.
есть клас:
 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  не в этом потоке, а просто в программе, то никаких ошибок не происходит. Подскажите пожалуйста где искать ошибку ?


 
ГореПрограммер   (2006-11-07 12:54) [1]

Да, если это имеет значение,
procedure loadip(mac:string;ind:integer);
fproc.q2.Active:=false;
fproc.q2.SQL.Clear;
fproc.q2.SQL.Add("select ip from ip_addr where mac_term="""+mac+"""");
fproc.q2.Active:=true;

после активации запроса вылетает как раз ошибка. и как я выше писал вылетает ошибка только при попытке сделать это в параллельном потоке


 
DVM ©   (2006-11-07 12:58) [2]


> ГореПрограммер   (07.11.06 12:51)  


> ar_excel

Это чаво такое и почему обращение к этой переменной может быть безопасным?


>    loadip(ar_excel.zaps[i].mac,i);
>    getminup(ar_excel.zaps[i].id);

Это чаво?


 
MetalFan ©   (2006-11-07 13:01) [3]

что есть fproc?
ты из потока к VCL компонентам лезешь...
создавай q2 в потоке)


 
ГореПрограммер   (2006-11-07 13:02) [4]


> > ar_excel

массив записей (record)

> >    loadip(ar_excel.zaps[i].mac,i);
> >    getminup(ar_excel.zaps[i].id);

procedure loadip(mac:string;ind:integer);
var i,j:integer;
begin
strex:=strex+"loadip";
fproc.q2.Active:=false;
fproc.q2.SQL.Clear;
fproc.q2.SQL.Add("select ip from ip_addr where mac_term="""+mac+"""");
fproc.q2.Active:=true;
......
function getminup(id:string):string;
begin
fproc.q2.Active:=false;
fproc.q2.SQL.Clear;
fproc.q2.SQL.Add("select min(date_up) from Jurup where Term_id="+id);
fproc.q2.Active:=true;
.....


 
ГореПрограммер   (2006-11-07 13:03) [5]


> что есть fproc?
> ты из потока к VCL компонентам лезешь...
> создавай q2 в потоке)

fproc это модуль, в котором содержится q2.
Поток создается в другом модуле


 
DVM ©   (2006-11-07 13:05) [6]


> массив записей (record)

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

>    loadip(ar_excel.zaps[i].mac,i);
>    getminup(ar_excel.zaps[i].id);

Убирай в Synchronize()


 
MetalFan ©   (2006-11-07 13:16) [7]


> DVM ©   (07.11.06 13:05) [6]
>
> Убирай в Synchronize()


... и смысл вынесения в поток теряется)


 
ГореПрограммер   (2006-11-07 13:18) [8]


> >    loadip(ar_excel.zaps[i].mac,i);
> >    getminup(ar_excel.zaps[i].id);
>
> Убирай в Synchronize()

Спасибо, все заработало.
Вот только второй вопрос. Мне необходимо чтобы
> procedure tloadfon.Execute;

выполнилась только один раз. Каким образом её следует переписать, чтобы после прохождения цикла поток прекратил свою работу ?
пробовал так:

> 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;
> terminate;
> end;

не помогло, все равно цикл выполняется еще раз


 
Сергей М. ©   (2006-11-07 13:24) [9]


> Мне необходимо чтобы
> > procedure tloadfon.Execute;
>
> выполнилась только один раз


Он (этот метод) всего один раз и выполнится, вне зависимости от того что у него в "потрохах"


 
Anatoly Podgoretsky ©   (2006-11-07 13:25) [10]


> и смысл вынесения в поток теряется)

А здесь он появляется в проявлении ошибки, и разница то? Небольшая, лучше пусть работает, чем не работает. Может и потоки не нужны.


 
ГореПрограммер   (2006-11-07 13:26) [11]

Да, но в этом случае вопрос. каким образом после однократного прохождения цикла внутри метода поток "исчезал"  ?


 
MetalFan ©   (2006-11-07 13:28) [12]

а нафиг в execute terminate вызывается??
почитай про потоки плз сначала, а потом тут ахинею городи.
неплохая статья, имхо
http://forum.vingrad.ru/topic-60076.html


 
DVM ©   (2006-11-07 13:29) [13]


> однократного прохождения цикла

один оборот цикла? Убрать цикл :)

FreeOnTerminate := True;
после отработки Execute он уничтожится.


 
Anatoly Podgoretsky ©   (2006-11-07 13:30) [14]

Он и исчезает и ненужный, лишний вызов метода Terminate


 
ГореПрограммер   (2006-11-07 13:31) [15]

procedure tloadfon.sinform;
begin
loadip(ar_excel.zaps[index].mac,index);
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
     Break;
   index:=i;
   Synchronize(sinform);
 end;
end;


В execute цикл проходит один раз, потом начинает заново.


 
ГореПрограммер   (2006-11-07 13:34) [16]

Пробовал так:

> procedure tloadfon.Execute;
> var i:integer;
> begin
> FreeOnTerminate := True;
> for i := 0 to ar_excel.count - 1 do
>   begin
>     if Terminated then
>       Break;
>     index:=i;
>     Synchronize(sinform);
>   end;
> showmessage("test");
> end;


showmessage не срабатывает. заканчивается цикл, тишина и потом цикла начинается заново.


 
DVM ©   (2006-11-07 13:34) [17]


> index:=i;

Это что еще? Почему меняешь из потока так смело значения переменных?


 
ГореПрограммер   (2006-11-07 13:36) [18]


> > index:=i;
>
> Это что еще? Почему меняешь из потока так смело значения
> переменных?

Извиняюсь, это я убрал уже. Результат тот же (


 
DVM ©   (2006-11-07 13:41) [19]

И все же ar_excel меняется в основном потоке или нет? Лучше создай у объекта потока поле FCount и свойство Count с доступом через критическую секцию. Так понадежнее. Хотя к количеству повторов цикла отношения это вряд ли имеет.


 
Anatoly Podgoretsky ©   (2006-11-07 13:45) [20]


> showmessage не срабатывает. заканчивается цикл, тишина и
> потом цикла начинается заново.

Происходит исключение, тихое.


 
Сергей М. ©   (2006-11-07 13:46) [21]


> showmessage не срабатывает


Его обязательно следует синхронизировать с осн.потоком.


> потом цикла начинается заново.


С чего ты взял ?


 
ГореПрограммер   (2006-11-07 13:48) [22]


> > showmessage не срабатывает. заканчивается цикл, тишина
> и
> > потом цикла начинается заново.
>
> Происходит исключение, тихое.

А каким образом диагностировать где и какая ошибка ?


 
ГореПрограммер   (2006-11-07 13:50) [23]


> > потом цикла начинается заново.
>
>
> С чего ты взял ?

procedure tloadfon.sinform;
begin
loadip(ar_excel.zaps[index].mac,index);
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
     Break;
   index:=i;
   Synchronize(sinform);
 end;
fstart.prog1.Position:=0;
fstart.stat.Panels[0].Text:="Все данные загружены";
end;


После окончания заполнения прогресбара. через секунлы 2 он опять начинает заполняться. Логично что еще раз срабатывает цикл


 
DVM ©   (2006-11-07 13:52) [24]

Поставь windows.beep(500,50); в цикл


 
Сергей М. ©   (2006-11-07 13:54) [25]

Потому что процедура sinform() (в которой твой прогрессбар заполняется) у тебя  вызывается ar_excel.count раз


 
ГореПрограммер   (2006-11-07 14:04) [26]


> Потому что процедура sinform() (в которой твой прогрессбар
> заполняется) у тебя  вызывается ar_excel.count раз

логично. мне и необходимо её выполнить ar_excel.count раз. Но после выполнения её ar_excel.count раз она выполняется опять столько же и так до бесконечности


 
DVM ©   (2006-11-07 14:07) [27]


> ГореПрограммер   (07.11.06 14:04) [26]

ты бип в цикл поставил? цикл работает?


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


> > ГореПрограммер   (07.11.06 14:04) [26]
>
> ты бип в цикл поставил? цикл работает?

Да, все тоже самое. цикл работает. и после окончания выполняется еще и еще


 
DVM ©   (2006-11-07 14:12) [29]

вообще странно, не должно быть если поток заново кто-то не создает.
поставь еще if Terminated then exit; вместо break;


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

Поставил. ситуация таже( вызывает create один раз, после строки создания потока поставил showmessage  сообщение появляется только один раз


 
Сергей М. ©   (2006-11-07 14:25) [31]

Отладчиком умеешь пользоваться ?


 
ГореПрограммер   (2006-11-07 14:30) [32]


> Сергей М. ©   (07.11.06 14:25) [31]

Если ставлю точку остановки на следующую строку после цикла то процесс выполнения не прерывается


 
Anatoly Podgoretsky ©   (2006-11-07 14:39) [33]


> if Terminated then exit; вместо break

Смысла нет, масло масляное


 
Сергей М. ©   (2006-11-07 14:42) [34]


> fstart.prog1.Position:=0; // <--- сюда ставишь ?
> fstart.stat.Panels[0].Text:="Все данные загружены";


 
ГореПрограммер   (2006-11-07 14:47) [35]

Да, именно сюда


 
Anatoly Podgoretsky ©   (2006-11-07 14:50) [36]

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

Но ты же именно это и просил, чем теперь недоволен?


 
Сергей М. ©   (2006-11-07 14:55) [37]


> FreeOnTerminate := True;
> for i := 0 to ar_excel.count - 1 do //<-- ставь брейкпойнт сюда и - вперед с песней, пошагово, с контролем происходящего после каждого шага


 
ГореПрограммер   (2006-11-07 15:01) [38]


>
> Но ты же именно это и просил, чем теперь недоволен?

Я хотел чтобы цикл выполнился один раз, а не бесконечное число раз


 
Сергей М. ©   (2006-11-07 15:03) [39]


> хотел чтобы цикл выполнился один раз, а не бесконечное число
> раз
>


Он и будет выполняться столько раз, сколько ему тобой предписано. Если найдешь и устранишь ошибки. Собственно к данному потоку это не имеет ни малейшего отношения - то же самое можно "накосячить" в любом ином потоке, в т.ч. и основном.


 
ГореПрограммер   (2006-11-07 15:11) [40]


> for i := 0 to ar_excel.count - 1 do
>  begin
>    if Terminated then
>      Break;
>    index:=i;
>    Synchronize(sinform);
>  end;

Да вроде по этому коду он должен выполнится ar_excel.count число раз. а не бесконечно


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


> Synchronize(sinform);


Закомментарь эту строчку - получишь желаемое.


 
Сергей М. ©   (2006-11-07 15:17) [42]

А если не получишь, то рассказывай подробно, что такое ar_excel, откуда он взялся ..


 
Anatoly Podgoretsky ©   (2006-11-07 15:25) [43]

> ГореПрограммер  (07.11.2006 15:11:40)  [40]

Так оно и есть и у меня есть подобные потоки, как написано так и работает - ar_excel.count число раз.
Убери Synchronize


 
ГореПрограммер   (2006-11-07 16:02) [44]


> Так оно и есть и у меня есть подобные потоки, как написано
> так и работает - ar_excel.count число раз.
> Убери Synchronize
>

а как тогда выполнять
> loadip(ar_excel.zaps[index].mac,index);
> getminup(ar_excel.zaps[index].id);

?


 
Сергей М. ©   (2006-11-07 16:05) [45]


> ГореПрограммер   (07.11.06 16:02) [44]


> а как тогда выполнять


Каком кверху.
Это намек на то, что в одной из этих п/программ у тебя ошибка.


 
MetalFan ©   (2006-11-07 16:30) [46]

класс ребята! групповая удаленная отладка))))


 
Anatoly Podgoretsky ©   (2006-11-07 16:53) [47]

> ГореПрограммер  (07.11.2006 16:02:44)  [44]

Ты убрал? Проблема исчезла или нет?


 
Anatoly Podgoretsky ©   (2006-11-07 16:53) [48]

> MetalFan  (07.11.2006 16:30:46)  [46]

Промывание мозгов через одно место


 
ГореПрограммер   (2006-11-07 16:54) [49]


>
> Ты убрал? Проблема исчезла или нет?

да, сейчас пытаюсь понять каким образом SQL запрос может такое вызвать такие последствия...


 
Сергей М. ©   (2006-11-07 16:57) [50]

сейчас выяснится, что автор слыхом не слыхивал ни  про потоконебезопасность  объектов доступа к СУБД, ни про Co[Un]Initialize ..

горе-прграммер. одним словом)..


 
Percent   (2006-11-07 16:58) [51]

for i := 0 to ar_excel.count - 1 do
begin
 if Terminated then
   Break;
 index:=i;
 Synchronize(sinform);
end;


Прикольный "поток"... Чему равно ar_excel.count?


 
ГореПрограммер   (2006-11-07 17:01) [52]


> Прикольный "поток"... Чему равно ar_excel.count?

числу


 
Сергей М. ©   (2006-11-07 17:03) [53]


> ГореПрограммер   (07.11.06 17:01) [52]



> числу


Да неужели ?!) ... Вот это новость ))


 
ГореПрограммер   (2006-11-07 17:04) [54]


> Да неужели ?!) ... Вот это новость ))

каков вопрос, таков ответ )


 
Сергей М. ©   (2006-11-07 17:09) [55]


> ГореПрограммер   (07.11.06 17:04) [54]


Ну-ну.
ПРодолжай умничать.

Проблема-то - у тебя, а не у нас.


 
ГореПрограммер   (2006-11-07 17:13) [56]


> Ну-ну.
> ПРодолжай умничать.
>
> Проблема-то - у тебя, а не у нас.

Умничать ? да нет, вроде даже не пытался

> ГореПрограммер   (07.11.06 16:54) [49]
>
>
> >
> > Ты убрал? Проблема исчезла или нет?
>
> да, сейчас пытаюсь понять каким образом SQL запрос может
> такое вызвать такие последствия...


 
MetalFan ©   (2006-11-07 17:41) [57]


> Сергей М. ©   (07.11.06 16:57) [50]
>
> сейчас выяснится, что автор слыхом не слыхивал ни  про потоконебезопасность
>  объектов доступа к СУБД, ни про Co[Un]Initialize ..
>
> горе-прграммер. одним словом)..


это и так уже понятно


 
ANB ©   (2006-11-07 18:28) [58]

Таки глупый вопрос - а нафига тут вообще поток ? Чтобы был ?


 
MetalFan ©   (2006-11-07 18:39) [59]

>[58]
я тож так сказал в [7] ;)


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

Смысл в том, чтобы после запуска программы в фоне из базы загружались дополнительные данные, не мешая при этом работе программы.


 
Сергей М. ©   (2006-11-08 09:57) [61]


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


> Умничать ? да нет, вроде даже не пытался


Знач мне показалось) ... Я-то, дурак, думал, что конкретное значение твоих данных типа integer могут быть равными попугаям, авоськам, да всему чему угодно ... А тут вон оно как дело-то певернулось - "числу", оказывается ..)

Мда ..

Ну так ты оттрассировал пошагово проблемный код ?


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


> Ну так ты оттрассировал пошагово проблемный код ?

В том- то и дело, что да. Ни в одной из тех двух процедур зацикленности не получается. Проверял даже проще: без потока исполнял цикл с этими процедурами, выполнился он корректно.


 
ГореПрограммер   (2006-11-08 10:16) [63]

Еще вопрос: а поток должен быть обязательно вынесен в отдельный модуль или это не влияет ?


 
Anatoly Podgoretsky ©   (2006-11-08 10:19) [64]


> Смысл в том, чтобы после запуска программы в фоне из базы
> загружались дополнительные данные, не мешая при этом работе
> программы.

Смысл хороший, а реализация.
И случайно не АДО ли ты используешь?


 
ГореПрограммер   (2006-11-08 10:23) [65]


> И случайно не АДО ли ты используешь?

DbExpress


 
DVM ©   (2006-11-08 10:31) [66]


> а поток должен быть обязательно вынесен в отдельный модуль
> или это не влияет ?

Не влияет, но когда в одном модуле область видимости другая несколько. Дружественные классы так сказать образуются.


 
Anatoly Podgoretsky ©   (2006-11-08 10:58) [67]

> DbExpress
А он случайно не использует асинхронные запросы


 
Сергей М. ©   (2006-11-08 11:01) [68]


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


Тогда рассказывай, с какой луны у тебя свалился ar_excel ..


 
ГореПрограммер   (2006-11-08 11:03) [69]

ar_excel это массив данных типа record
Данные загружаются при запуске программы после запуска мне необходимо для уже загруженных данных подгрузить несколько полей из базы данных.


 
Сергей М. ©   (2006-11-08 11:06) [70]


> ar_excel это массив данных типа record


И откуда у массива (!) взялось нечто выглядящее как count ?
Давай уже показывай декларацию ...


 
ГореПрограммер   (2006-11-08 11:17) [71]


> Сергей М. ©   (08.11.06 11:06) [70]

Массив динамический. вместо count можно, безусловно, и использовать length, но было изначально сделано так. Count это просто колличество записей в массиве.
rzap_excel=record
 id:string;
 sat:string;
 stat:string;
 mac:string;
.....
....
....
end;
azap_excel=record
 count:integer;
 zaps:array of rzap_excel;
end;
var
ar_excel:azap_excel;


 
Anatoly Podgoretsky ©   (2006-11-08 12:20) [72]

> DVM  (08.11.2006 10:31:06)  [66]

Какая же другая, когда это находится в секции public глобальнее уровня нет.


 
Anatoly Podgoretsky ©   (2006-11-08 12:22) [73]

> ГореПрограммер  (08.11.2006 11:17:11)  [71]

И доступ к azap_excel наверно возможен из разных потоков


 
DVM ©   (2006-11-08 12:31) [74]


> Какая же другая, когда это находится в секции public

если public тогда без разницы конечно


 
Сергей М. ©   (2006-11-08 12:48) [75]


> Count это просто колличество записей в массиве


Вот так и говори : count - это поле некоей записи)

Что скажешь насчет [73] ?


 
ГореПрограммер   (2006-11-08 12:56) [76]


> И доступ к azap_excel наверно возможен из разных потоков

Да, возможен. но изменений внутри этой переменной не происходит, изменения вносятся в момент выполнения паралельного потока только им.


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


> изменений внутри этой переменной не происходит


Это все на словах.

А теперь подтверди это реальным кодом ..


 
Anatoly Podgoretsky ©   (2006-11-08 13:18) [78]

> Сергей М.  (08.11.2006 13:03:17)  [77]

Зачем на словах, у него же явно много потоков запускается, ведь именно на это и жалуется.


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


> Зачем на словах, у него же явно много потоков запускается,
>  ведь именно на это и жалуется.

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


 
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.75 MB
Время: 0.062 c
2-1163084546
Greenchel
2006-11-09 18:02
2006.11.26
Фильтрация символов в TEdit


9-1137086278
Galiaf
2006-01-12 20:17
2006.11.26
DCE в GLScene.


3-1159344071
DancerMan
2006-09-27 12:01
2006.11.26
SQL функция IIF


2-1162830309
Меломан
2006-11-06 19:25
2006.11.26
Копировать с CD диска все mp3-шки


4-1152738077
GanibalLector
2006-07-13 01:01
2006.11.26
Тип винчестера