如果你在线程中不改变vDomino的话,是可以的。
str1,i1需要在线程对象中声明两个private变量再将str1,i1赋予他们
在线程的构造函数中把相关信息保存在线程对象中。

解决方案 »

  1.   

    我发表问题时并没有测试预想的代码,现在,问题来了,如果按我所该的那样,当访问SqlCom时出错,当选中2个items时,似乎因为两个线程都访问sqlcom中包含的adodataset时冲突,sqlcom也是一个自动化对象,同时也是一个全局对象,其实如果在线程的execute中这样写
    for i:=0 to Frmmain.ListViewRes.items.count-1 do
          begin
            if Frmmain.ListViewRes.Items[i].Checked then
              begin
                 SqlCom.importresource(str1,vDomino,i1) ;
                       //str1:string,文件路径;
                      //vdomino:olevariant,一个自动化对象
                      //i1:整形
             end;
          end;//end for
    也可以完成我的需求,而且不会导致sqlcom的问题;我只想不让程序看起来似乎死掉了
    而且,当我这样写时,程序居然没有任何错误
    但是,按照书上所写的,vcl并不都是线程安全的,要使用synchronize()来进行同步
    那为什么这样写没有错误呢,是偶然的吗?如果用更好的方法,我该怎样改写代码呢?
      

  2.   

    "vcl并不都是线程安全的,要使用synchronize()来进行同步":
        看你怎么理解线程,线程就是与你的主进程同时运行的一段代码,他使用与主线程独立的堆栈,但全局变量等等并不独立。所以一般线程不能操作屏幕,因为主线程可能随时要更新屏幕。
        同步操作就是要避免两个进程同时存取同一个地址空间。
        但是如果只有一个进程写,其他进程只读,是不会产生进程冲突的。基于此原则,随便你怎么安排都可以。像屏幕操作因为windows还会刷新屏幕,所以线程还是不能执行此类操作.
      

  3.   

    关键地方加一些进度条不就行了,并一定不要忘了加application.postmessage,否则的话,windows就真的象死了一样
      

  4.   

    用application.postmessage我也试过,感觉没有多加一个线程效果更好。我也想添加一个进度条,但是似乎无法捕捉进度,除非从sqlcom控件中添加一个方法,然后不停的访问。
      我在考虑这种情况有没有更好的方法,能够将execute()中    for i:=0 to ListViewRes.items.count-1 do
          begin
            if ListViewRes.Items[i].Checked then
              begin
                SqlCom.importresource(strXmlPath,vDomino,ImportMode) ;
             end;
          end;//end for
    的关于界面部分拆离出来,用什么来做一个中转呢?有没有一个通用的规则?