CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

多线程读取数据库同一表的所有记录.且不能重复..怎样实现?.应该是简单问题.算散分帖吧..

楼主oovv(不小了)2003-11-03 00:53:41 在 Delphi / VCL组件开发及应用 提问

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

1 楼oovv(不小了)回复于 2003-11-03 01:11:25 得分 0

怎么会没有人理睬呢?  
   
  sigh..Top

2 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2003-11-03 01:18:12 得分 20

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

3 楼chenkandy(多少爱可以重来)回复于 2003-11-03 09:32:01 得分 5

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

4 楼trainbox(rain)回复于 2003-11-03 10:27:01 得分 5

这样做,没有必要Top

5 楼libra163(石头)回复于 2003-11-03 10:37:36 得分 5

其实这个方法就是分页读数据的方法,每个线程读去指定部分的数据。  
  线程1:1-10  
  线程2:11-20  
  分页的方法过去论坛里有答案,自己找找看吧。Top

6 楼weidegong(weidegong)回复于 2003-11-03 10:50:36 得分 5

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

7 楼zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之)回复于 2003-11-03 12:55:43 得分 5

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

8 楼steve0531(宠坏显卡)回复于 2003-11-03 18:47:55 得分 0

分页?Top

9 楼outer2000(天外流星)回复于 2003-11-03 18:58:28 得分 5

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

10 楼oovv(不小了)回复于 2003-11-03 19:38:21 得分 0

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

11 楼steve0531(宠坏显卡)回复于 2003-11-03 19:41:56 得分 0

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

12 楼steve0531(宠坏显卡)回复于 2003-11-03 19:54:36 得分 45

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;Top

13 楼steve0531(宠坏显卡)回复于 2003-11-03 20:01:03 得分 0

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

14 楼dickeybird888(小鸟)回复于 2003-11-03 20:30:54 得分 5

哈哈  
  (·¥·)  
  行了!Top

15 楼steve0531(宠坏显卡)回复于 2003-11-03 22:19:51 得分 0

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

16 楼oovv(不小了)回复于 2003-11-04 01:18:53 得分 0

结结结..  
  不过.还有个问题.  
  我重新开贴放分吧..Top

相关问题

  • 如何使用多线程技术来读取数据库记录并利用读取的记录数据进行其他数据处理?(内有说明)
  • 我的一个程序要读取一个数据库中的大量记录,用多线程能否加快读取速度呢?
  • 程序要读取一个数据库中的大量记录,用多线程能否加快读取速度呢?
  • 请问大虾,既然大家认为读取一个数据库中的大量记录,用多线程并不能加快读取速度,那网络蚂蚁,jetcar等下载软件以及一些邮件群发软件为何采用多线程,它们之间有什么不同呢?请详细解释一下!!
  • 如何把数据库的记录分条读取出来?
  • 如何从数据库中读取当月记录
  • 初学C#,求教如何读取数据库记录集
  • 各种数据库中,如何读取前10条记录?
  • 如何从数据库逐条的读取记录?
  • 关于读取数据库指定记录的问题!

关键词

  • 线程
  • 数据库
  • 多线程
  • 字段
  • 查询
  • 数据
  • 代码
  • adoqueryselect
  • dmmain
  • 记录

得分解答快速导航

  • 帖主:oovv
  • ly_liuyang
  • chenkandy
  • trainbox
  • libra163
  • weidegong
  • zhoutian618
  • outer2000
  • steve0531
  • dickeybird888

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo