问题不大,就是资源浪费严重;Connection可以只用一个的。对界面的操作可以采用事件的形式。

解决方案 »

  1.   

    能说的详细点吗?
    connection真的可使用datamodal的connection吗?
    对vcl如何使用事件的方式,我也是直接调用其事件来实现的,但比如增加stringgrid的行时,可能还是要写代码(互斥)的。
    欢迎继续讨论!!
      

  2.   

    全部ADOQuery连接到一个Connection是可行的,这个别担心,我这么用过;关于事件可以这样:在线程中定义事件,主线程创建各个线程的时候连接这些事件;关于增加StringGrid的问题,我认为问题不大,Canvas在绘制的时候也是被锁定了的,就是用的临界区,呵呵。
      

  3.   

    to: MSHawk(憨憨) 
    "主线程创建各个线程的时候连接这些事件"
    是何意?
      

  4.   

    这样,假设TQueryThread有查询到字段,则触发事件
    TOnQueryRecord = procedure(pData:Pointer) of object;
    主线程就是你的MainForm所属线程啦,
    var QueryThread:TQueryThread;
    begin
      QueryThread := TQueryThread.Create;
      QueryThread.OnQueryRecord := GetRecord;//这个Procedure是MainForm里的一个,如此而已。奉送一个Tip:不要使用Free释放线程,最好是用Terminate,并且设置线程为freeOnTerminate:=Tree;这样不会出错,否则,呵呵,你会头大无比。
      

  5.   

    我也觉得资源浪费太严重了,尤其是同时运行多个客户端读取数据库服务器中数据时你的应用可能会导致服务器的响应非常慢。
    一般的习惯是每个应用只使用一条数据库连接,使用数据模板来管理你对数据库的访问,即使是采用多线程方式也尽量不动态创建数据集控件,因为频繁的Create和Free会占用大量的系统资源,要是你没有处理好资源释放问题,可能你的系统每次运行会强行占用一些资源不能释放。
    你可以将数据集控件作为参数传递给你的执行线程,注意在线程中及时释放数据集和互斥就可以,也不是很麻烦!
      

  6.   

    我好像还是不太明白:
    QueryThread.OnQueryRecord := GetRecord
      

  7.   

    我的习惯是做两个DM,一个是公用的,放TAdoConnection,和主线程用的TAdoQuery.
    另一个是用来做模板,放TAdoQuery等的.
    每个线程都new一个模板线程使用,
    用完注意释放掉就可以了。
    哈哈,因为我每个线程做的都是同样的东西,
    对我来说,这样做最好。
    所以应该根据你线程间的关系来决定采用哪种方式。
      

  8.   

    OK。最后一招:用Windows的消息,每个事件发生时,各个线程向主线程的窗口发送消息吧,最好用PostMessage函数,这个不用同步了,嘻嘻,因为Windows已经帮你同步了,而且也是最简单的。
      

  9.   

    to: nicky_he(尼克) 
    我的情况和你差不多,我现在将connection改为使用dm中的connection,然后在线程中create query控件,不知可否?
      

  10.   

    用六个Connection,不用处理同步,起用事务和锁,让数据库自己去处理数据冲突问题.适用于Oracle、SQL Server等较完善的数据库。
    如果安你原来的方式,所有的数据操作都是串行的,可以用一个Connection,把数据库访问的操作放到同一个线程中。参见这个贴子:http://www.csdn.net/Expert/TopicView1.asp?id=744355中mrzho的方案。     ?????????????
         ____     ____
         \ p \   / g /
          \ l \_/ n /
           \ a   o /
            \ i s /
             \ n /
              \_/