procedure TSplitDataATM.Execute;
var
ls: TList;
i, j, k, m: Integer;
begin
ls := GetSplitData(FSplitCount); //从队列中取出数据,再分批次插入数据库 j := FSplitCount div ONCE_INSERT_CNT;
k := 0;
while (not Terminated) do
begin
for i := 0 to j - 1 do
begin
BatchInsert(ls, k, k + ONCE_INSERT_CNT - 1);
k := k + ONCE_INSERT_CNT;
if Terminated then Break;
end;
BatchInsert(ls , k, ls.Count - 1);
end; for m := 0 to ls.Count - 1 do Dispose(PSplit(ls[m]));
ls.Clear();
ls.Free();
end;
procedure TSplitDataATM.BatchInsert(ls: TList; beginIndex: Cardinal; endIndex: Cardinal);
begin
//组建Insert SQL语句,将TList中的指针对象插入数据库
end;说明:
队列中缓存的数据比较多(即FSplitCount值比较大,例如:20000),从队列中取出后,在线程的Execute方法中,分批次插入数据库(例如:ONCE_INSERT_CNT=1000)
问题:
线程Resume以后,Execute只会执行一次BatchInsert,然后线程就执行完成并自动销毁了 通过加日志的方式,发现以下代码不会执行:
k := k + ONCE_INSERT_CNT;
……
k的值也没有变化。 通过调试发现,原因是i的值不为0,总是为一个较大的值,例如:30803952,28006642,44300076,通过在Execute的第一行加:i := 0也无济于事。 错在哪里呢???
var
ls: TList;
i, j, k, m: Integer;
begin
ls := GetSplitData(FSplitCount); //从队列中取出数据,再分批次插入数据库 j := FSplitCount div ONCE_INSERT_CNT;
k := 0;
while (not Terminated) do
begin
for i := 0 to j - 1 do
begin
BatchInsert(ls, k, k + ONCE_INSERT_CNT - 1);
k := k + ONCE_INSERT_CNT;
if Terminated then Break;
end;
BatchInsert(ls , k, ls.Count - 1);
end; for m := 0 to ls.Count - 1 do Dispose(PSplit(ls[m]));
ls.Clear();
ls.Free();
end;
procedure TSplitDataATM.BatchInsert(ls: TList; beginIndex: Cardinal; endIndex: Cardinal);
begin
//组建Insert SQL语句,将TList中的指针对象插入数据库
end;说明:
队列中缓存的数据比较多(即FSplitCount值比较大,例如:20000),从队列中取出后,在线程的Execute方法中,分批次插入数据库(例如:ONCE_INSERT_CNT=1000)
问题:
线程Resume以后,Execute只会执行一次BatchInsert,然后线程就执行完成并自动销毁了 通过加日志的方式,发现以下代码不会执行:
k := k + ONCE_INSERT_CNT;
……
k的值也没有变化。 通过调试发现,原因是i的值不为0,总是为一个较大的值,例如:30803952,28006642,44300076,通过在Execute的第一行加:i := 0也无济于事。 错在哪里呢???
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货