这个控件怎么做?(200分)

  • 主题发起人 主题发起人 中原问鼎
  • 开始时间 开始时间

中原问鼎

Unregistered / Unconfirmed
GUEST, unregistred user!
从文件流中读出数据,使数据能直接显示在 dbgrid 中,这个控件是dataset的继承,
并且可以和datasource连在一起.

我很急,希望大家给我出主意.
 
从文件文件流读出数据, 居然要显示到dbgrid中, 你累不累呀?
这是谁出的馊主意, 实现是可以实现, 只要你不怕麻烦!
 
也不是说不可能,只是。。。
太累!
 
dataset,还要带一个dbgrid?
真的很累
 
问题:吃饱了没事干的,请进。 ( 积分:300, 回复:81, 阅读:719 )
分类:数据库-C/S型 ( 版主:千中元, luyear )
来自:zhaohai9, 时间:2002-1-25 3:53:00, ID:883540 | 编辑 [显示:小字体 | 大字体]
工控软件中,数据库是建一个内存表,采集仪表的数据,远端客户可以连接这个内存表
每秒的数据更新都可在客户端读出来,用delphi如何实现远程访问内存表?我试了一下
dxmemtable,没有成功,道行太浅,请大侠指点。


来自:yyanghhong, 时间:2002-1-25 5:17:00, ID:883543
which database are you using?



来自:mikegong, 时间:2002-1-25 8:24:00, ID:883604
如果是SQL Server2000,使用内存驻留表,可以吗?
DBCC PINTABLE


来自:zhaohai9, 时间:2002-1-25 11:13:00, ID:884138 | 编辑
数据库是msaccess.


来自:maming, 时间:2002-1-25 11:32:00, ID:884206
不知道,关观


来自:吴剑明, 时间:2002-1-25 11:34:00, ID:884219
你的内存表是怎么建立的


来自:zhaohai9, 时间:2002-1-25 11:41:00, ID:884242 | 编辑
dxmemtable就是express develop的内存表控件,我直接在控件中设置字段,建
一个远程模块,用socketconnection连接,在客户端可以连接上,增加数据,在
客户端的dbgrid中可以看到记录。可是在客户端我再打开一个线程,看不到第一个
线程中dbgrid显示的数据。


来自:荷塘新月, 时间:2002-1-25 12:32:00, ID:884377
Sorry,I don't know.


来自:吴剑明, 时间:2002-1-25 14:50:00, ID:884644
抱歉。对于第三方控件怎么用的问题我一般帮不上你的忙。


来自:zhaohai9, 时间:2002-1-25 14:52:00, ID:884650 | 编辑
若不用第三方控件,该如何做?给出思路就行。


来自:雨人, 时间:2002-1-25 15:26:00, ID:884700
你的远端客户是怎么连接的?
你用什么远程访问方法!我觉得如果用COM/Dcom结构,
哪么你把内存表转化为olevariant;
在应用服务器定义一个新方法,
gettable();
客户段通过
Dcomconnection.appserver.gettable()调用,
要实时读出笨办法,是每秒客户段调用一次



来自:robertcool, 时间:2002-1-25 15:19:00, ID:884716
试试Rx里的memorytable


来自:吴剑明, 时间:2002-1-25 15:21:00, ID:884725
你的问题就是个简单的网络通信问题。在你的主机上跑个程序,把你内存表的数据发送给客户
端就是。


来自:zhaohai9, 时间:2002-1-25 15:28:00, ID:884750 | 编辑
用一对socket控件解决啊,有没有再好一点的?


来自:htw, 时间:2002-1-25 15:40:00, ID:884781
服务器端自建内存表, 再在客户端访问, 这种方式不太好
请问你用的什么数据库? 不一定非要建你所说的内存表



来自:zhaohai9, 时间:2002-1-25 15:52:00, ID:884823 | 编辑
htw:我看其他的工控软件都是用内存表的,因为客户端每秒中数据都要与服务器同步,
我想跟数据库没多大关系吧?你知道,在工业中,每秒中,数据都有变化的,用sql
access都实现不了数据如此快的更新。


来自:曹晓钢, 时间:2002-1-25 16:11:00, ID:884866
你说的我都不熟悉,包括access, memory table,还有你的第三方控件。
一个小小的问题,access是不是也需要提交?你首先要弄清楚到底你的数据存进去了没有?


来自:zhaohai9, 时间:2002-1-25 16:20:00, ID:884887 | 编辑
我的内存表中的数据不提交到本地数据库中,只是在内存中实时存放从其他仪表采集来的
数据,其他应用再从内存表中读取。


来自:雁孤行, 时间:2002-1-25 16:26:00, ID:884898
Sorry!不太懂内存表。


来自:skeleton, 时间:2002-1-25 16:28:00, ID:884903
dxmemtable对多线程的支持情况不明,应该是不好的


来自:左右手, 时间:2002-1-25 16:43:00, ID:884937
应该跟访问一般的数据没什么区别呀,RX的MEMORYTABLE和DEVDE的DXMEMDATA我都用过,
没什么问题,挺好用的呀。


来自:zhaohai9, 时间:2002-1-25 16:47:00, ID:884947 | 编辑
左右手老哥:
在远程调用服务器上的内存表有什么好的办法,要求数据同步。


来自:zhangkan, 时间:2002-1-25 17:10:00, ID:885014
对不住,我对你说的那控件也不熟悉,没用过.不过,你这问题我觉得倒挺好,也是比较容易
遇到的问题.我的想法跟雨人兄的比较接近,以前有讨论过用olevariant传递数据.如果你
能告诉控件下载地址,我也想学学怎么用.因为我们这儿以后也有可能遇到这种情况,但是在
局域网内,不知你的工作环境?
你说的数据每秒都有变化,那么你也需要每秒都反映变化,还是一段时间再反映呢?实际上,
我觉得只要数据量不是太多,你用一般的表甚至文本文件就可以做到,如果你的数据量很多,
那么你的网络流量能做到吗?你内存表的资料怎么交换,还是要通过内存流,那么你用olevariant,
文件流等等不是一样吗?呵呵,瞎说一通.想看看你说的那dxmemtable是个什么东东,以及你遇
到的具体情况.


来自:zhaohai9, 时间:2002-1-25 17:20:00, ID:885064 | 编辑
dxmemdata在
http://www.51delphi.com
有,要求数据同步。效果最好能象dde一样。实时更新,就是客户端数据显示与服务器内存表
的数据要同步显示。三层结构不适用在此。


来自:eagleblue, 时间:2002-1-25 18:29:00, ID:885118
呵呵 典型的C/S程序 类似木马的形式
B:客户程序 运行再你的机器上
A:服务器程序 运行在工控机上
定义数据访问子过程,访问所谓的内春表的数据
定义数据通讯子过程,和简单的协议 应答客户端的请求和进行数据通讯
如B向A发送一个字符串“sdfsdf”表示“嘿 哥们 把 XXX 内春的数据给我看看”
A听到就执行相应的数据访问过程,并把得到的数据通过通讯子过程送到B中
B对收到的数据进行处理

数据通讯不知道你用串口还事以太网 反正也差不多,通讯应该进行校验检查以保证安全
其实 吴剑明 已经提到过了 我再详细的说说 呵呵

BTW:你老兄怎么总是这么色咪咪的,为老不尊:)


来自:taozhiyu, 时间:2002-1-25 22:38:00, ID:885629
类似的工作还没做过,不过马上就要做了。呵呵!至于怎么连接,用连接组件不就可以了!
可以看看Leewei得书


来自:zhaohai9, 时间:2002-1-25 22:43:00, ID:885636 | 编辑
我现在觉得用liwei的三层不实际。因为客户端要求数据跟服务器同步。而且数据每秒
都要更新。


来自:bubble, 时间:2002-1-25 22:54:00, ID:885651
都解决不了就用soap试试看.
反正我也不懂.


来自:yyanghhong, 时间:2002-1-25 23:04:00, ID:885667
the usual method is creating a large array in memory.
the data inside the array is loaded from the database at the beginning,
and save back to database at the end.
the appliction only update and select the record of the array,
no delete and insert, because the amount of sensor or controller has been
fixed in advance. if need add or remove the device, you might change in table and
reload to memory.



来自:zhaohai9, 时间:2002-1-25 23:07:00, ID:885672 | 编辑
请大家继续讨论


来自:yyanghhong, 时间:2002-1-25 23:22:00, ID:885690
About the data synchronize, normally using local networking broadcast.
UDP can do it.





来自:t1122, 时间:2002-1-25 23:50:00, ID:885703
内存表我到是用过,在foxpro时代就有了,那时刚上大一。
你的问题不在内存表上,你试使用一个普通的临时表,两个线程怎样,我没有看到你的源程序
不过类似的问题常常发生在第一个线称的优先级太高,由于实时控制,第一个线程可能在不停
传送数据,占用的cpu的绝大部分时间,第二个线程就会没有时间响应。
在工控软件重要看你的时间是否要求准确,有时为了精确的时间经常是采用dos或者unix/linxe
操作系统,有时远程数据采集采用推技术,就是说服务器主动向客户端来传输更新后数据,而不是
远程访问数据库。如果采用SQLSERVER作为服务器,那么建议采用分布式的做法,在客户端定制发布
服务器端作为发布服务器,这样会传输可能会及时一些。还有,即使每一秒钟都会有变化也不一定
非的用内存表,变化不过是增加了一条纪录,就算是很普通的数据库(有是到是更快)也应该可以。
如果不行就做文本吧,听说工控软件很多都是做文本,先写到缓存里(可以比秒钟精确的多),再从
缓存里把数据取出来加工,根本不用什么数据库(也许实时控制完成后分析用的到)。


来自:Pipi., 时间:2002-1-26 0:45:00, ID:885750
你的dxmemtable不要放在RemoteDataModule,而放去别的公共的地方


来自:zhaohai9, 时间:2002-1-26 0:48:00, ID:885754 | 编辑
大佬,
为什么不能放到RemoteDataModule中呢?要放到哪呢?


来自:Pipi., 时间:2002-1-26 1:03:00, ID:885764
因为你的是内存的数据,不是放在硬盘上的,不同的dxmemtable实例有不同的数据嘛
能不能添加一个datamodule啊,就是要不同的remote data module实例访问同一个dxmemtable
实例,当然,有线程的问题的,不同的线程不能同时访问这个dxmemtable,那么线程模式
或者同步技术就要考虑一下了


来自:zhaohai9, 时间:2002-1-26 1:05:00, ID:885765 | 编辑
老大,我的数据是从仪表中采集过来,用updata更新到access中。很慢啊,
你可以随便试啊,你做的测试很快吗?不可能做到每秒中数据更新吧?即使做到,
客户端每秒还要读出来,不可能数据同步吧?


来自:Pipi., 时间:2002-1-26 1:22:00, ID:885775
谁说用access了,不是内存表吗,内存表不能有多个实例啊


来自:Pipi., 时间:2002-1-26 1:38:00, ID:885781
数据不复杂就干脆自己用udp发、收数据啦,
数据复杂的话,而你又不是很高手的话,还是用你原来的3层好了,这样不用写太多的东西
当然不怕麻烦的话,数据再复杂也可以自己写udp的通信程序



来自:zhaohai9, 时间:2002-1-26 2:03:00, ID:885791 | 编辑
pipi:
公司就我一个人搞开发,水平又不高,只希望快速能出产品。我也想用socket开发,总觉
得用三层很难解决问题,可是用socket开发又太麻烦了,两个月内可能开发不完,而且不宜
扩展。


来自:吴剑明, 时间:2002-1-26 12:17:00, ID:886261
你先找本WINSOCK的书来看看吧。
我答题也只能告诉你方向性的。这个在我个人说明里已经讲了。:)
两个月太长了,给你一星期就可以作完了。


来自:ably, 时间:2002-1-26 12:33:00, ID:886285
access数据如何进入内存,请给个源码例子吧?


来自:lld, 时间:2002-1-26 15:53:00, ID:886713
用Midas+TSocketConnection是最佳解决方案:

服务器端:将TClientDataSet+TDataSetProvider放在TRemoteDataModule上
客户端:用TClientDataSet+TSocketConnection连接到服务器


来自:张剑波, 时间:2002-1-26 16:01:00, ID:886728
多维STRING的数组可代替内存表,CLIENT向SERVER传递。
多维数组可随时更新,一更新可再上传。


来自:程云, 时间:2002-1-26 20:37:00, ID:887163
为何使用非使用第三方控件来建立内存表呢,
你完全可以使用ADODataSet和ClientDataSet来建立。
这样,也就不用为客户端的读取发愁了。

什么内存表呀,说的玄乎乎的。
不就是动态在程序中创建一个数据集,
象里面写点数据吗?
好象Delphi本身就作不到,非要用dxmemtable。

var
memdata: TDataSet;
begin
memdata := TDataSet.Create(Self);
memdata.Fields.Add(…)


end;

给它再添加几个字段,再用TDataSetProvider发布出去,这样,客户端会看不到吗?

噢,对了,你可千万别把这个数据集也放在远程模块中呀,不然,嘿嘿!
只把TDataSetProvider放在那里,或者,把远程模块设为 Single 的,

难怪呢,呵呵!思路不一样吗。



来自:小猪, 时间:2002-1-26 21:43:00, ID:887340
呵呵,找了很多人啊,我一点都不懂


来自:Pipi., 时间:2002-1-26 22:08:00, ID:887384
各个客户端美妙要接收到什么数据啊,说说它们的类型嘛
可以每个客户端用socket自己接收到广播,自己维护自己的内存表(不管其他客户端的)
历史数据要保存吗,要保存的话那么只需要一个或者2个客户机把接收到的数据永久保存


来自:skeleton, 时间:2002-1-26 22:16:00, ID:887398
说来说去,dataset(不管是dxmemtable还是什么)都是为client端设计的,根本不适合
放在服务端,裆燃不支持直接的多用户的访问,我也想不出啥好办法,要么三层,要么广播。
还是三层快一些



来自:jrq, 时间:2002-1-26 22:20:00, ID:887407
这么多高手在~~~~

我在听课 请大家继续

帮忙提前!


来自:Pipi., 时间:2002-1-26 22:32:00, ID:887426
不过第三方的内存表比TClientDataset做成的内存快好多,我就一般用DBISAM带的内存表
而且TClientDataset还需要一个dll


来自:t1122, 时间:2002-1-26 23:57:00, ID:887540
我来给大家更正几个概念,尤其是程云。
关于工控机和windows
大家说了怎么多,其实工控机很少用windwos的,今天跟我哥哥(工控的博士正在读博士后)谈到这个
问题,他很奇怪,怎么会有人用windows做。有些工控机要求时实型很强,比如毫秒级的精确(激光发
生器),这样的程序多数使用dos或者是嵌入事操作系统,还有就是采用专门的时实操作系统。windows
的时间精度不够,也不好控制。最常见的是将windows作为管理来使用,不会是控制。
什么是内存表
表建立在内存中不是把的把表建立在中的概念,在数据库中建立的表都可以读到内存中去,打开表就是
将表的内容读到内存中去。但是如果一段时间不去操作表或者检索表,那么表就会被写道逻辑内存中,
就是硬盘中。建立内存表是指打开后的表始终写到高速缓冲(内存中)而不将表的内容写道逻辑内存中。
所以程云的说法不是数据库中的内存表的概念。
关于内存表的思路
内存表跟普遍的表操作起来没有什么区别,只不过不能太大,否则就要调整数据库的缓冲设置,否则
不能达到最佳的速度。是不是使用access是个可选项,我们随后讨论。updata速度慢会不会程序的思路
有问题?我们常常发现"连续执行"sql语句并不快,将控件的sql语句动态生成,生成一次执行一次,这
样并不快。我之所以将连续执行打了双引号时因为这不是连续执行sql语句,而是连续执行单独的sql语句
这是需要sql的分析、优化、解释一连串的重复操作,其实将几条命令写成一条sql语句一次解释执行会快
的多。如果用sqlserver的事件跟踪就会发现这个差别。一次执行1000条insert和连续1000次执行一条insert
的速度是不同的。所以说3、4秒才完成update,需要我们反思一下设计的思路。
现在在讨论一下是否使用access的问题,使用数据库方便管理,数据库最重要的品质是管理,而不是效率。
其实几百个string完全不用数据库,现在的机器内存很大,为什么不用内存?开个二维数组,或者纪录型的
数组,不就是“表”吗?内存的速度很快,指针访问有很方便,不用取出数据库里数据,直接访问就行了吗。
如果项统计、管理、汇总各种类型的数据,将数组存成二进制文件,在一定的时候读入数据库中(汇总操作)
这才是比较标准的开发模式(至少是我认为的)。
大家还有什么好的建议,也欢迎和我交流。
tiansan@sina.com


来自:程云, 时间:2002-1-27 0:03:00, ID:887551
多谢你的指正,
但内存表,也只是在内存中开辟一块缓冲区而已,
只要,这种开辟不是用超越系统的方式进行的,
最终也会象内存中的其它数据一样,
一定时间不用,而被逻辑内存中。
在Delphi中,如何才能保证它只存在于高速缓冲中呢?


来自:ydfq, 时间:2002-1-27 0:51:00, ID:887599
佩服啊。越发感到老了:(
学习中。。。


来自:t1122, 时间:2002-1-27 1:24:00, ID:887619
缓冲区是由服务器来管理,服务器负责协调资源和作业的管理。需要说明的是服务器不是应用软件,
而是系统软件。
delphi中如何保证,准确的说,具体地说……
我也不知道。
我想是这样,如果一个服务器,就象sqlserver或者是其他什么,需要申请一块内存,有几种方式,
其中一种分类是静态的、动态的,有一种分类是逻辑的、物理的。申请的缓冲区时静态的,是不会
放到逻辑内存中的,只有服务器需要释放的时候才会被其他程序占用。
如果做一个系统软件的话,可以考虑是否有delphi来实现缓冲,否则的话还是使用服务器来创建。
服务器的缓冲区的大小是可以设置的,由服务器来管理很方便。


来自:t1122, 时间:2002-1-27 9:19:00, ID:887681
缓冲和内存是不同的,我们可以释放掉内存,但是有些缓冲是不能释放的,比如键盘和鼠标的
缓冲。使用delphi建立内存表也就是使用delphi来调用数据库的语句来建立内存表。
access中如何建立内存表我不知道,不过在sqlserver中可以采用sp_configure来设置内存
的大(max server memory <4M)小(min server memory ),
使用DBCC PINTABLE 来创建内存表,不过不会将表读入到内存中。当表中的页由普通的
Transact-SQL 语句读入到高速缓存中时,这些页将标记为内存驻留页。当 SQL Server 需要空间
以读入新页时,不会清空内存驻留页。SQL Server 仍然记录对页的更新,并且如有必要,将更新的
页写回到磁盘。然而,在使用 DBCC UNPINTABLE 语句使该表不驻留之前,SQL Server 在高速缓存
中一直保存可用页的复本。


来自:zhaohai9, 时间:2002-1-28 8:07:00, ID:888965 | 编辑
对不起大家了,这两天在家上不了网,急死我了,现在在公司上。这两天静下来思考了一下
发觉用三层来处理不是很好,当客户端与服务器数据同步不够快,还是用socket控件解决
好点,向缓冲区写数据,socketclient向缓冲区读数据,再分析处理,和服务器保持数据
同步。数据类型有float,string,integer类型,看看大家还有什么好的解决方法,不知
鼎鼎大名的美国intellution公司的FIX工控软件大家有没有用过的,他对客户端服务器数据
同步做的很好。


来自:SINGLBOY, 时间:2002-1-28 8:47:00, ID:889026
我也不懂:(


来自:zhaohai9, 时间:2002-1-28 10:07:00, ID:889274 | 编辑
我跟一个自动化公司的项目经理讨论过,他是用vb的,已经出了产品,
就是在内存中建表,存放实时采集来的数据。


来自:SuperJS, 时间:2002-1-28 11:18:00, ID:889470
关注中


来自:aerobull, 时间:2002-1-28 11:33:00, ID:889508
zhaohai9,:
其实你自己的想法是最好的.用socket控件,
加上t1122的思路.应没问题了.




来自:djdsz, 时间:2002-1-28 11:34:00, ID:889512
用SOCKET传送吧,比较实时。MemData放在客户端,客户端接收到就向MemData中加入一条
记录(我用Rx的)


来自:SINGLBOY, 时间:2002-1-28 12:02:00, ID:889575
我真的不会!


来自:Headchen, 时间:2002-1-28 12:04:00, ID:889582
dxmemtable只能在客户端,试图通过远程访问是不太现实的。具体实现方案我同意楼上的


来自:forss, 时间:2002-1-28 12:27:00, ID:889626
没做过呀.


来自:DragonPC_???, 时间:2002-1-28 13:19:00, ID:889761
BDE内置了in Memory Table这种数据库格式,建立了BDE别名后,应该是可以远程访问的,不
知道dxmemtable是在BDE的这个特色的基础上发展来得,还是它自己定义的一套新的冬冬,如
果不是BDE的技术,可能不能简单的实现远程调用。

但是我知道有一个叫做kbmMemTable的,写的相当完善。推荐看看。Indy 9有一个TCPdataset
的范例,就是使用的这个kbmMemTable控件,实现内存数据库的远程访问。
http://www.optical.dk/delphi/prod01.htm
http://www.nevrona.com/Indy/download90.html


详细请见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=883540
 
看你也是蛮辛苦,+200
 
后退
顶部