我建立了同时运行多个线程。有的时候如果数据量小的话(几条的时候)就可以完成执行完成。但一量数据量大了。他就有的时候执行到几十条后就停下来。有的时候几百条就停下来。就是因为这样我无法调试他有没有好的谁能够告诉我一些好的办法。如何能解决这个问题呀。我写的源码能不能帮忙的看一下呀 因为代码太长无法贴出来。写在下面的二个文件里面
http://www.dztv.cn/rh/delphi/unit1.txt FOrm页面
http://www.dztv.cn/rh/delphi/Thread.txt 线程页面
http://www.dztv.cn/rh/delphi/unit1.txt FOrm页面
http://www.dztv.cn/rh/delphi/Thread.txt 线程页面
假设当你点击按钮之后,取下一个地址,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万个地址.这时。如果我将他存储在数组里面的话。我怕装不下。而且就算装下。性能也肯定降低非常多。所以望能再接受一下大哥的指点
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); // 直接运行
为什么使用临界区就会产生这样的线程突然间的停下来呢?
嗯。一开始我觉得应该是字符串数组溢出造成的[然后我又换了直接传地址过去也一样出错],再然后我就全部都加了try异常处理,但他还是出错(每一个小部份都加上,无一漏出)。.到后来我实在没办法了就把cs去除之后。他就完全没有再出现过这个问题。所以在这样的情况下的话我就糊涂了。
1:有的人说synchronize最好带上临界. 但有的人说不要。我个人比较懒。一般不带没啥问题...
2:但是如果真的是临区的问题话。应该是某段代码冲突了(在出现这个问题后。我反复重新写了六次线程(实践过,和在网上下载过一些代码来查看..))
2,如果会并发的时候会访问到同一个数据(或者常来的话)需要给那个方法体加 同步方法。或者直接对那个变量加读写锁。