在线程中使用ADO,具体做法是:
1、1个ADOCONNECTION连接1个数据
2、在线程中用几个ADOdataset通过一定条件读写ADOCONNECTION连接的数据表。出现问题:
有的时候不出错。但不知道什么时候出现著名的:access violation at adress xxxx错误。
我看了下,这个时候数据仍然是写进数据表的。但是那个异常确始终抛出,即使你用了try ...except照样报错比如最简单的一段:  try
   ado:=tadodataset.Create(nil);
   ado.Connection :=form1.ADO ;
   dxskinlistbox5.Items.Clear ;
   ado.CommandText :='select * from adress';
   ado.Open ;
   if not ado.Eof then
      labelnetshow.Caption :='zzzzzz'
   else
      labelnetshow.Caption :='xxxxxx';
   for i:=1 to ado.RecordCount do
    begin
     dxskinlistbox5.Items.Add(trim(ado.fieldbyname('中文名').AsString));
     ado.Next ;
    end;
   ado.Close ;
   freeandnil(ado);
   except
    ado.Close ;
    freeandnil(ado);
   end;执行以上语句的时候,在不出错之前毫无问题,但是一旦出错那个错误,那么执行以上语句就是一直报:
access violation at adress xxxx但是执行以上语句结果是对的,该显示还显示,该写数据库的还是写数据库,结果没有任何问题。查了一些网友说的:
1、时间长了,adoconnection可能断开了。(我认为,如果断开那么数据就无法操作,现在我不是这种情况,结果正常,所以排除)
2、1个adoconnection最好只连接1个adodataset。(我认为,ADO可以多线程的)现在感觉好像是加了vmprotect壳引起的问题,但不能确定。以上救助大家。

解决方案 »

  1.   

    在线程里面直接操作vcl组件?I服了U!
      

  2.   

    在线程里不可以直接操作ADO吗?
    不这样做,在线程如何访问数据库?
      

  3.   

    dxskinlistbox5之类的不是直接使用的VCL,别误会。
      

  4.   

    ADO连接是线程不安全的。需要一个线程一个连接。
      

  5.   

    ADO连接是线程不安全的。需要一个线程一个连接。也就是每个线程的ADO都使用1个ADOCONECTION?
      

  6.   

    在线程中定义一个变量
    然后创建线程的时候就把form中的控件传递进去,赋值给线程中的变量,线程内就直接使用此变量
    而不是去访问form中的控件
      

  7.   

    楼上,这个我知道的,我举例那段可能不恰当。
    现在的问题应该在ADO方面。
      

  8.   

    既然用线程,就在线程里创建连接吧。你那段代码不在线程里跑无所谓,可是没有一个对象是线程安全的,跟是不是直接使用的vcl没有关系。这么说吧,你在线程里直接访问外部对象都存在安全问题,除非那个对象专门做过多线程保护。
      

  9.   

    线程序中访问VCL(或者任何对象),要分情况,读访问很多情况都是允许的,
    比如
    for i:=0 to 100000 do
      S := Form1.Edit1.Text;
    只要运行期间Form1和Edit1都健在,而且没有任何地方改变Edit1.Text(包括用户在Edit1上修改了值都算修改),那这段代码无论开多少线程同时跑都是没问题的,而我们通常无法保证这一点,所以线程中使用才显得格外谨慎。
    这是界面上的东西,而对其他对象如StringList,在线程中,读访问完全没问题,而写访问,就要同步了。更正一下,这和传不传对象到线程中,完全没关系,哪里来的理论哦。而写入,决大多数情况是不可靠的。
    就你的代码来说,这几句是不可靠的
    dxskinlistbox5.Items.Clear
    labelnetshow.Caption :='zzzzzz'
    labelnetshow.Caption :='xxxxxx';
    dxskinlistbox5.Items.Add(trim(ado.fieldbyname('中文名').AsString));
    ADO多线程的设计,一般考虑为一个线程,一个ADO连接,同时数据库访问组件,也是一个线程一个。
      

  10.   

    Sorry,得把条件说清楚
    就象对StringList对象的多线程访问,只要线程运行期间,没有修改过其内容,包括Add,Delete,LoadFrom...等等操作,那么读访问可以不需要同步,读访问包括读访问以下属性Count,Strings[n],Text等等,如果条件不成立,也就是说,部分线程在读,部分在写,那就得都同步了。
      

  11.   

    应该是ADO不安全的问题,现在改成1个线程用1个adoconnection试试