我作个邮件收发系统,问题出现在每隔30分钟(假定)收邮件(从邮件服务器下载)时,程序处于忙状态,影响用户其他的正常操作。
我想实现收邮件后台默默执行,不影响用户操作,不知foxmail和outlook是怎么解决的。
有人建议我用线程实现,我的问题是:
1线程中若设计到数据库的存取,是在进程里动态创建数据集组件还是共享全局的组件(即我放到窗体上的组件)。
2在进程执行过程中能否动态创建或显示一个窗体(tform),并修改窗体的属性。
3谁能给我一个涉及到我的问题的好例子在下不胜感激您的参与,谢谢!

解决方案 »

  1.   

    只要你能保证,在同一时刻应用程序只会启动一个接收线程,则可以直接用共享的全局组建,否则需要同步一下。
    线程中可以显示Form,但是最好不要在线程内部显示,否则还是处于忙状态。
    没有例子,我基本不看例子。
      

  2.   

    一般不建议在线程当中使用VCL对象,若需要使用就要维护好线程安全工作。
      

  3.   

    听说delphi的线程做得并不好,至少比起来VC要差一截!!!
    所以建议最好不要用线程操作界面上的东西。
      

  4.   

    TmyThread = class(Tthread)
    private  
      Dataset1: TADoDataset;
      Form1: TForm;
    public
      constructor create; override;
      destructor destroy; override;
    implemente
      constructor create; override;
      begin
        Dataset1 := TADoDataset.create(nil);
        Form1 := TForm.create(nil);
      end;
      destructor destroy; override;
      

  5.   

    1、最好在线程中生成自己的数据访问组件;数据库读写的冲突由DBMS处理,你只管读写即可,不用担心多线程对数据库的影响;如果是ADO存取注意在线程execute中先初始化COM不然会出错的;
    2、在线程中可以创建新的窗体,但要在execute中创建,不然窗体的消息队列用的还是主线程的,还是会阻塞;
    3、Delphi的线程封装的比VC的好,但开销稍大一些。
      

  6.   

    建立一个过程 procedure ********然后CreatThread(....)
      

  7.   

    可以的,使用TThread类
    用VCL访问Syxxxx的那个函数,可以对VCL进行访问的http://lysoft.7u7.net
      

  8.   

    我也做过同样的问题,没及时总节出经验,不过记得那时是用共享全局的组件方法,感觉不是很好
    以后改成在TThread类里面创建,销毁吧