由于代码很长,而且处理数据过程比较复杂,我就不详细讲,讲讲要点看大伙能不能帮我一把。首先,我是利用数组建立线程的,也就是 var mythread: array[1..10] of tmythread begin for i:=1 to 10 do begin mythread[i]:=tmythread.create; mythread[i].xxxx; ..... end; end;我把线程都设置成freeonterminate的了。然后线程中有三个共享主线程的过程。 一是读数据,从Mainform里读一个TStrings的数据来处理,在EXECUTE的循环里每次都用到。然后一个是想Mainform里的一个Memo回写出错的LOG信息的,只在异常中用到。最后在execute方法末,我调用到mainform.threaddone来处理结束线程。这个过程主要是一个记数器,每次调用其中一个全局变量就会加一,这样当着个变量和线程数量相等的时候,程序便认为所有线程已经完成了,显示提示信息说工作完成。第一个问题是,当其中一个线程遇到问题,马上会影响到整个程序的运行。我的程序10个线程一开始可以一秒处理大概3-40个数据和连接,但当遇到第一个错误,马上下降到3-4个/秒,如果继续遇到错误,甚至会几秒也处理不了一个连接和数据,但我从LOG看来也不是所有线程都遇到错误,肯定是正确的线程也被阻碍了。第二个问题就是最后一个线程呆滞的问题。我让他们在THREADDONE的时候往LOG里写记录,前9个结束的都很快,惟独最后第10个等了好长时间,甚至几十分钟才写出来,都不知道它干什么去了。我试过如果不建立任何连接,只是读入数据然后在LOG里回写的话,一切都很正常的,速度很快,也就说明读数据和写LOG的共享主线程都不会互相阻碍的。如果只使用到UDP连接部分,速度还可以,但遇到异常会使整个程序处理明显变慢,从3-400个/秒到几十或者几个每秒,但很快就可以恢复速度。但一用到TCP连接部分,遇到异常就马上慢得离谱了,已经到了无法接受的程度。
光有自然语言描述是不好看出问题的,因为你认为你做到了哪些可能你并没有做到, 关于用mainform.threaddone来记数(已经完成的线程),我以前接手的一个程序也这么做,但这种方法似乎并不好,经常记数错误码,我后来的处理是在主线程中的适当地方判断, DoneCount:=0; for i:=1 to maxCount do if not (mythread[i]=nil) then DoneCount:=DoneCount+1; if (DoneCount=maxCount) then myEnd; 不明白啊。 可能你线程中的代码有问题吧,先不妨只建一个线程或者两个线程来调试?这样容易发现问题些。
帮你up
var
mythread: array[1..10] of tmythread
begin
for i:=1 to 10 do
begin
mythread[i]:=tmythread.create;
mythread[i].xxxx;
.....
end;
end;我把线程都设置成freeonterminate的了。然后线程中有三个共享主线程的过程。
一是读数据,从Mainform里读一个TStrings的数据来处理,在EXECUTE的循环里每次都用到。然后一个是想Mainform里的一个Memo回写出错的LOG信息的,只在异常中用到。最后在execute方法末,我调用到mainform.threaddone来处理结束线程。这个过程主要是一个记数器,每次调用其中一个全局变量就会加一,这样当着个变量和线程数量相等的时候,程序便认为所有线程已经完成了,显示提示信息说工作完成。第一个问题是,当其中一个线程遇到问题,马上会影响到整个程序的运行。我的程序10个线程一开始可以一秒处理大概3-40个数据和连接,但当遇到第一个错误,马上下降到3-4个/秒,如果继续遇到错误,甚至会几秒也处理不了一个连接和数据,但我从LOG看来也不是所有线程都遇到错误,肯定是正确的线程也被阻碍了。第二个问题就是最后一个线程呆滞的问题。我让他们在THREADDONE的时候往LOG里写记录,前9个结束的都很快,惟独最后第10个等了好长时间,甚至几十分钟才写出来,都不知道它干什么去了。我试过如果不建立任何连接,只是读入数据然后在LOG里回写的话,一切都很正常的,速度很快,也就说明读数据和写LOG的共享主线程都不会互相阻碍的。如果只使用到UDP连接部分,速度还可以,但遇到异常会使整个程序处理明显变慢,从3-400个/秒到几十或者几个每秒,但很快就可以恢复速度。但一用到TCP连接部分,遇到异常就马上慢得离谱了,已经到了无法接受的程度。
关于用mainform.threaddone来记数(已经完成的线程),我以前接手的一个程序也这么做,但这种方法似乎并不好,经常记数错误码,我后来的处理是在主线程中的适当地方判断,
DoneCount:=0;
for i:=1 to maxCount do
if not (mythread[i]=nil)
then DoneCount:=DoneCount+1; if (DoneCount=maxCount)
then myEnd;
不明白啊。
可能你线程中的代码有问题吧,先不妨只建一个线程或者两个线程来调试?这样容易发现问题些。