我建立了同时运行多个线程。有的时候如果数据量小的话(几条的时候)就可以完成执行完成。但一量数据量大了。他就有的时候执行到几十条后就停下来。有的时候几百条就停下来。就是因为这样我无法调试他有没有好的谁能够告诉我一些好的办法。如何能解决这个问题呀。我写的源码能不能帮忙的看一下呀  因为代码太长无法贴出来。写在下面的二个文件里面 
  http://www.dztv.cn/rh/delphi/unit1.txt  FOrm页面
  http://www.dztv.cn/rh/delphi/Thread.txt  线程页面
 

解决方案 »

  1.   

    请原谅我的愚蠢,在大哥您的帮忙下。我相信我能解决我所遇到的问题。可是我却无法理解你口中的话我的程序大概上是这个意思
      假设当你点击按钮之后,取下一个地址,http://webim.csdn.net/Messages/kenshinggg.ashx
                                        http://webim.csdn.net/Messages/a.htm (分解后)
                                        http://webim.csdn.net/?a.htm  (分解后)
          然后会由程序自动将地址分解,并重新组合。然后再决定每一次执行的线程是多少,是由某一个地址的/数来决定数线程。。最后写到memo里面.. 而按照大哥您的思路就是:我首先要把所有的地址都先分解出来,然后存储在某一个数组里面。最后再按照已预设线程数来执行? (不知道我有没有误解),但是如果是这样的话。假设我有一万个地址。他们平均每一个人有三个目录(也就是/)那么再组合我的其他数值(假设二个),那一条地址将会被分解为2+3=六条地址。那么1万个地址就会变成6万个地址.这时。如果我将他存储在数组里面的话。我怕装不下。而且就算装下。性能也肯定降低非常多。所以望能再接受一下大哥的指点
      

  2.   

    整理好的数据放到一个StringList中 ,另你应该单独创建一个线程来专门处理整理好的数据,处理过的及时删掉就可以了。删除的时候用互斥量来保护下StringList。   
      

  3.   

    因为"代码太长",所以没有打开连接看你的代码赫赫. 不过提点建议看看是否有帮助, 想要确定是否是死锁可以用Intel的thread profiler,来看呀. 很直观的. 先下个评估版,功能一样的.30天之内查这个问题应该绰绰有余了. 以后再想用还可以找他们要.
      

  4.   

    还是用TBB吧,一般不用自己处理加解锁等问题. 这种问题一般很费时间去DEBUG, 而且可能只有换了个平台才出现错误.
      

  5.   

     yinxd6112 说的很对,不过也可以分析一次,再执行一条。只不过执行的线程一直处于等待状态而已!
      

  6.   

    提供点思路1, 我没看出你cs有什么作用,你完全可以只用Synchronize,大不了再另建一个procedure2, 是不是线程本身有问题,线程异常后终止3, 二分法确定线程到多少数目时发生问题,再具体分析。
      

  7.   

    使用Intel(R) Thread Checker, 几分钟搞定.
      

  8.   

    在无尽的耐心等待与想办法后。终于把线程的问题解决了。但不知道原理是怎么回事。一开始我按照平常写线程那样的方法来写我的线程。
      strurl := Tgetstr;  //接收传递过来的地址
      xdshu := Tgetshu;   //传递过来的线程
      Tmo := Tgetmo;
      Tsta:=Tsta1;
      FreeOnTerminate := True; // 自动删除
      InitializeCriticalSection(CS); //初始化临界区
      inherited Create(False); // 直接运行       因为一直都进行临界区模式来写我的程序。所以老是执行到一半的时候就卡在那里动也不动了。。
    后来我把他临界区去除后。程序整体运行完全正常。。
      strurl := Tgetstr;  //接收传递过来的地址
      xdshu := Tgetshu;   //传递过来的线程
      Tmo := Tgetmo;
      Tsta:=Tsta1;
      FreeOnTerminate := True; // 自动删除
     // InitializeCriticalSection(CS); //初始化临界区
      inherited Create(False); // 直接运行
                
            为什么使用临界区就会产生这样的线程突然间的停下来呢?
      

  9.   


    嗯。一开始我觉得应该是字符串数组溢出造成的[然后我又换了直接传地址过去也一样出错],再然后我就全部都加了try异常处理,但他还是出错(每一个小部份都加上,无一漏出)。.到后来我实在没办法了就把cs去除之后。他就完全没有再出现过这个问题。所以在这样的情况下的话我就糊涂了。
      1:有的人说synchronize最好带上临界. 但有的人说不要。我个人比较懒。一般不带没啥问题...
      2:但是如果真的是临区的问题话。应该是某段代码冲突了(在出现这个问题后。我反复重新写了六次线程(实践过,和在网上下载过一些代码来查看..))
      
      

  10.   

        1,自己做一个线程池 jdk里边就有提供
        2,如果会并发的时候会访问到同一个数据(或者常来的话)需要给那个方法体加 同步方法。或者直接对那个变量加读写锁。
      

  11.   

    我理解楼主, 能力不是一天就能提高的. 多问是个好习惯.但高手不一定有耐心来详细解释. 就这个问题来说,我强烈建议楼主试试Intel的thread checker, 花很少的时间安装并运行他,可以查出潜藏的会造成各种线程问题的代码,并给你解释,试用期可以用一个月,功能都有效. 免费请个高手来帮你查问题,查不出也不费什么. 何乐而不为呢.
      

  12.   

    Mobile接单群,qq群:44045541,专注mobile开发应用软件开发、项目开发共享、欢迎开发人员、业务人员。