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

oovv 2003-11-03 12:53:41
我使用access数据库+多线程查询数据.然后进行其它操作..

=============目的=============
多个线程的功能一样.每个线程都是在数据库中同一个表中查询出记录.然后得到的数据进行其它操作..

=============问题=============
于是有了这样一个问题..虽然每个线程的功能都一样.但.所有的线程查询出的数据不能有重复.也就是说.一个线程读了的记录.其它线程就不要再读了.所有线程读完所有记录.不能有重复..

=============补充=============
其实.查询数据库用不着多线程.但我是要用多线程对查询的数据进行其它处理..
我使用ado进行查询.每个线程用一个单独的ado..所以线程是安全的..
其实.简单一点说就是.所有线程读取所有记录.且不能重复..

还请各位能帮忙..小弟不胜感激..
...全文
570 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
oovv 2003-11-04
  • 打赏
  • 举报
回复
结结结..
不过.还有个问题.
我重新开贴放分吧..
zhoutian618 2003-11-03
  • 打赏
  • 举报
回复
来晚了。

同意 ly_liuyang(Liu Yang)

没有必要这么做呢。

也做不了啊。
weidegong 2003-11-03
  • 打赏
  • 举报
回复
Nod,就是分页的问题

不过否可以说说你最终要做什么,看看是否还有更好的办法。
libra163 2003-11-03
  • 打赏
  • 举报
回复
其实这个方法就是分页读数据的方法,每个线程读去指定部分的数据。
线程1:1-10
线程2:11-20
分页的方法过去论坛里有答案,自己找找看吧。
trainbox 2003-11-03
  • 打赏
  • 举报
回复
这样做,没有必要
steve0531 2003-11-03
  • 打赏
  • 举报
回复
结帖哦!
怎么还不结帖?

你还欠我200多分呢。
这次我就少要点吧。因为我是按ly_liuyang(Liu Yang)的思路给你写的代码。
chenkandy 2003-11-03
  • 打赏
  • 举报
回复
像您补充的说明一样:这样就比较好作业了.
1: 如果您的TABLE 中有多于的FLAG字段就更好做了
每个线程作业后把把选出的数据在TABLE中的FLAG字段UPDATE
成’Y’, 线程选择的时候,只选择FLAG不为’Y’的纪录.
2: 若没有这个字段, 你可以做一个临时的TABLE, 把线程选择的纪录都
INSERT 到这个 临时的TABLE, 每个线程选择时候都必须选择临时的TABLE没有的数据. (临时的TABLE必须有主健)
dickeybird888 2003-11-03
  • 打赏
  • 举报
回复
哈哈
(·¥·)
行了!
steve0531 2003-11-03
  • 打赏
  • 举报
回复
oovv,我完全按你的要求给写的。
1,检索符合条件的记录数目 字段use=true
2,在各个记录后面写上线程编号
3,绝对准确!!!!!!!!!!

注意,你符合条件的记录数目不一定,线程数目也不一定。所以,不可能把所有记录都平均分配到每个线程。比如,10个记录,3个线程,你给每个线程3.33个记录?所以,多出来的记录都给第一个线程分配了。这样,第一个线程就是4个,第2和3个线程是3个记录。

wokao,给你想的多周到哦。
小样!别整天咋呼着我欺负你。
steve0531 2003-11-03
  • 打赏
  • 举报
回复
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;
steve0531 2003-11-03
  • 打赏
  • 举报
回复
同意 ly_liuyang(Liu Yang)
oovv居然给我发了消息,让我处理这个帖子。好吧。贴段代码。
其实,就是ly_liuyang(Liu Yang)的思路让我写的这段代码。测试成功。
oovv。如果我理解错了你的目的。那么请给我qq。

好了现在贴代码。
oovv 2003-11-03
  • 打赏
  • 举报
回复
但ado是线程不安全的..只有对微软的ado打上补丁.才稍微好些..但客户端不一点打补丁哦.
outer2000 2003-11-03
  • 打赏
  • 举报
回复
其实用多个THREAD检索同一个数据库,要同时保持多个连接,很浪费资源的,还不如一个,;
steve0531 2003-11-03
  • 打赏
  • 举报
回复
分页?
ly_liuyang 2003-11-03
  • 打赏
  • 举报
回复
分任务读取,像FlashGet那样的下载就是这样
例如100条记录分5个任务,每个读20条记录,就是这样

如果是执行SQL的Query,那么数据库系统是不支持这样的
只能对结果集分任务读取,查询是没办法的,还没有DBMS能支持,而且也没有必要,效率不能提高多少的
oovv 2003-11-03
  • 打赏
  • 举报
回复
怎么会没有人理睬呢?

sigh..

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧