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

Вниз

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

 
ГореПрограммер   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.72 MB
Время: 0.043 c
2-1162987359
Димыч
2006-11-08 15:02
2006.11.26
Поверх всех окон


15-1162970107
Некто_
2006-11-08 10:15
2006.11.26
Нужна простенькая программка для работы с *.dbf


2-1163062278
Greenchel
2006-11-09 11:51
2006.11.26
Неизменяемые размеры формы


15-1162963169
DelphiN!
2006-11-08 08:19
2006.11.26
Изменить пустой белый фон в IE на черный


2-1162963780
Marat
2006-11-08 08:29
2006.11.26
Нужна помощь





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