我使用access数据库+多线程查询数据.然后进行其它操作..=============目的=============
多个线程的功能一样.每个线程都是在数据库中同一个表中查询出记录.然后得到的数据进行其它操作..=============问题=============
于是有了这样一个问题..虽然每个线程的功能都一样.但.所有的线程查询出的数据不能有重复.也就是说.一个线程读了的记录.其它线程就不要再读了.所有线程读完所有记录.不能有重复..=============补充=============
其实.查询数据库用不着多线程.但我是要用多线程对查询的数据进行其它处理..
我使用ado进行查询.每个线程用一个单独的ado..所以线程是安全的..
其实.简单一点说就是.所有线程读取所有记录.且不能重复..还请各位能帮忙..小弟不胜感激..
多个线程的功能一样.每个线程都是在数据库中同一个表中查询出记录.然后得到的数据进行其它操作..=============问题=============
于是有了这样一个问题..虽然每个线程的功能都一样.但.所有的线程查询出的数据不能有重复.也就是说.一个线程读了的记录.其它线程就不要再读了.所有线程读完所有记录.不能有重复..=============补充=============
其实.查询数据库用不着多线程.但我是要用多线程对查询的数据进行其它处理..
我使用ado进行查询.每个线程用一个单独的ado..所以线程是安全的..
其实.简单一点说就是.所有线程读取所有记录.且不能重复..还请各位能帮忙..小弟不胜感激..
例如100条记录分5个任务,每个读20条记录,就是这样如果是执行SQL的Query,那么数据库系统是不支持这样的
只能对结果集分任务读取,查询是没办法的,还没有DBMS能支持,而且也没有必要,效率不能提高多少的
1: 如果您的TABLE 中有多于的FLAG字段就更好做了
每个线程作业后把把选出的数据在TABLE中的FLAG字段UPDATE
成’Y’, 线程选择的时候,只选择FLAG不为’Y’的纪录.
2: 若没有这个字段, 你可以做一个临时的TABLE, 把线程选择的纪录都
INSERT 到这个 临时的TABLE, 每个线程选择时候都必须选择临时的TABLE没有的数据. (临时的TABLE必须有主健)
oovv居然给我发了消息,让我处理这个帖子。好吧。贴段代码。
其实,就是ly_liuyang(Liu Yang)的思路让我写的这段代码。测试成功。
oovv。如果我理解错了你的目的。那么请给我qq。好了现在贴代码。
var
count:integer; //总符合条件的记录数目
tcount:integer; //没个线程平均分配的记录数目
ftcount:integer; //第一个线程分配的记录数目
tno:integer; //线程编号
x:integer; //
allthread:integer;//你定义的线程数目
nowthread:integer;//实际使用的线程数目
begin
allthread:=5 //你定义的线程数目为5,随便你,自己填去。
//计算符合条件的记录数目
DMMain.ADOQuerySelect.Close;
DMMain.ADOQuerySelect.SQL.Clear;
DMMain.ADOQuerySelect.SQL.Add('select * from '+selecttable+' where USE=true');
DMMain.ADOQuerySelect.Open;
count:=DMMain.ADOQuerySelect.RecordCount;
if count < allthread then //如果总记录数少于线程数目,实际使用的线程数目就是你的记录数目。
nowthread:=count
else
nowthread:=allthread; //反之,实际使用的线程数目就是你定义的数目。
if count > 0 then //如果你符合条件的记录数目为0,那么不工作哦。showmessage!反之,处理。
begin
//计算各线程平均分配的记录数目
tcount:=trunc(count/nowthread); //平均分配的。当然是整数。
ftcount:=count-tcount*(nowthread-1); //计算第一个线程的数目。因为你的记录数目不可能完全分配到各个线程。总有多的或少的,所以,多的或少的都给第一个线程了。
//分配线程任务
DMMain.ADOQuerySelect.First;
//分配第一个线程任务
for x:=1 to ftcount do
begin
DMMain.ADOQuerySelect.Edit;
DMMain.ADOQuerySelect.FieldByName('THREAD').AsString:='1'; //把线程号写到这个记录中
DMMain.ADOQuerySelect.Post;
DMMain.ADOQuerySelect.Next;
end;
//分配其它线程任务
tno:=2;
for tno:=2 to nowthread do
begin
for x:=1 to tcount do
begin
DMMain.ADOQuerySelect.Edit;
DMMain.ADOQuerySelect.FieldByName('THREAD').AsString:=inttostr(tno); //把线程号写到这个记录中
DMMain.ADOQuerySelect.Post;
DMMain.ADOQuerySelect.Next;
end;
end;
end
else
showmessage('没有符合条件的记录,请重新选择.');end;
1,检索符合条件的记录数目 字段use=true
2,在各个记录后面写上线程编号
3,绝对准确!!!!!!!!!!注意,你符合条件的记录数目不一定,线程数目也不一定。所以,不可能把所有记录都平均分配到每个线程。比如,10个记录,3个线程,你给每个线程3.33个记录?所以,多出来的记录都给第一个线程分配了。这样,第一个线程就是4个,第2和3个线程是3个记录。wokao,给你想的多周到哦。
小样!别整天咋呼着我欺负你。
怎么还不结帖?你还欠我200多分呢。
这次我就少要点吧。因为我是按ly_liuyang(Liu Yang)的思路给你写的代码。