我使用access数据库+多线程查询数据.然后进行其它操作..=============目的=============
多个线程的功能一样.每个线程都是在数据库中同一个表中查询出记录.然后得到的数据进行其它操作..=============问题=============
于是有了这样一个问题..虽然每个线程的功能都一样.但.所有的线程查询出的数据不能有重复.也就是说.一个线程读了的记录.其它线程就不要再读了.所有线程读完所有记录.不能有重复..=============补充=============
其实.查询数据库用不着多线程.但我是要用多线程对查询的数据进行其它处理..
我使用ado进行查询.每个线程用一个单独的ado..所以线程是安全的..
其实.简单一点说就是.所有线程读取所有记录.且不能重复..还请各位能帮忙..小弟不胜感激..

解决方案 »

  1.   

    分任务读取,像FlashGet那样的下载就是这样
    例如100条记录分5个任务,每个读20条记录,就是这样如果是执行SQL的Query,那么数据库系统是不支持这样的
    只能对结果集分任务读取,查询是没办法的,还没有DBMS能支持,而且也没有必要,效率不能提高多少的
      

  2.   

    像您补充的说明一样:这样就比较好作业了.
      1:   如果您的TABLE 中有多于的FLAG字段就更好做了
    每个线程作业后把把选出的数据在TABLE中的FLAG字段UPDATE
    成’Y’, 线程选择的时候,只选择FLAG不为’Y’的纪录. 
      2:   若没有这个字段, 你可以做一个临时的TABLE, 把线程选择的纪录都
       INSERT 到这个  临时的TABLE, 每个线程选择时候都必须选择临时的TABLE没有的数据. (临时的TABLE必须有主健)
      

  3.   

    Nod,就是分页的问题不过否可以说说你最终要做什么,看看是否还有更好的办法。
      

  4.   

    来晚了。同意 ly_liuyang(Liu Yang) 没有必要这么做呢。也做不了啊。
      

  5.   

    其实用多个THREAD检索同一个数据库,要同时保持多个连接,很浪费资源的,还不如一个,;
      

  6.   

    但ado是线程不安全的..只有对微软的ado打上补丁.才稍微好些..但客户端不一点打补丁哦.
      

  7.   

    同意 ly_liuyang(Liu Yang)
    oovv居然给我发了消息,让我处理这个帖子。好吧。贴段代码。
    其实,就是ly_liuyang(Liu Yang)的思路让我写的这段代码。测试成功。
    oovv。如果我理解错了你的目的。那么请给我qq。好了现在贴代码。
      

  8.   

    procedure TMain.Button1Click(Sender: TObject);
    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;
      

  9.   

    oovv,我完全按你的要求给写的。
    1,检索符合条件的记录数目 字段use=true
    2,在各个记录后面写上线程编号
    3,绝对准确!!!!!!!!!!注意,你符合条件的记录数目不一定,线程数目也不一定。所以,不可能把所有记录都平均分配到每个线程。比如,10个记录,3个线程,你给每个线程3.33个记录?所以,多出来的记录都给第一个线程分配了。这样,第一个线程就是4个,第2和3个线程是3个记录。wokao,给你想的多周到哦。
    小样!别整天咋呼着我欺负你。
      

  10.   

    结帖哦!
    怎么还不结帖?你还欠我200多分呢。
    这次我就少要点吧。因为我是按ly_liuyang(Liu Yang)的思路给你写的代码。