为什么这样触发不了多线程? (200分)

  • 主题发起人 主题发起人 ccoomm
  • 开始时间 开始时间
C

ccoomm

Unregistered / Unconfirmed
GUEST, unregistred user!
我们是通过第三方控件进行通讯和对数据库进行操作。通过Socket收发信息,当我们
接收到信息,就产生一个线程对信息进行处理,处理完后,转发出去;现在的问题是
:如果一个处理过程需要3个Query的话,如果我们产生N个线程(而一个线程对应一个
处理过程),那么,我们需要3*N个Query吗?
 
我用的是Asta组件!!!
 
当然,如果在多线程中,不但每个线程需要单独的Query,最好还是单独的Connection
不过这些Query和Connection是自己在线程中new出来.如果有Connection Pool,Connection
就从pool中取出来.
 
这样的:asta运用时,我的查询控件都要跟asta的socket控件一起用(无论是ClientSocket,
还是ServeSocket)。然后, 只要把查询控件AstaClientDataSet的AstaClientSocket属性定义为
所用的Socket,就可以访问Socket所指向的机器的数据库了。
 
我现在使用线程数组,当我接收到数据,就自动建立一个线程来处理(其中的所有要使用的
控件都是动态生成的)。可是现在有新问题:我把数组的最长长度设为10,如果10线程都在
运行,而这个时候又有数据来,我该怎么处理?也就是说要多次使用同一个线程,该如何操
作?我查过资料,建议说用线程列表,但没有具体说明和例子。请问哪位大侠有这方面的资
料或实例?我的E-mail:ccyyee@hotmail.com。
 
为什么这样触发不了多线程?
//定义一个线程
type
Tsthread = class(TThread)
private
Fsysno: string;
SendStr: string;
AstaControl: TAstaClientSocket;
{ Private declarations }
protected
procedure sendpro;
procedure Execute;
override;
public
constructor Create(SYSNO: string;
AstaControlparm: TAstaClientSocket);
end;
……
//定义一个记录类型
type
S_session = record
st: Tsthread;
used: boolean;
end;
……
Sendsession: array[1..5] of S_session;
const maxthread = 5;
……
//初始化过程
var
i: integer;
begin
for i := 1 to maxthreaddo
Sendsession.used := False;
end;

//以下是一段创建线程的程序
j := -1;
for i := 1 to maxthreaddo
begin
if Sendsession.used = False then
begin
j := i;
Sendsession.st := Tsthread.Create(S, Form1.AstaClientSocket1);
Sendsession.st.OnTerminate := SThreadDone;
Sendsession.used := True;
break;
end;
end;
if j = -1 then
application.processmessages;
……
procedure TForm1.SthreadDone(Sender: TObject);
var
i: integer;
begin
for i := 1 to maxthreaddo
if Sendsession.used then
if Tsthread(Sender).handle = Sendsession.st.Handle then
Sendsession.used := False;
end;
 
线程列表继承了TList。。。
线程数目设置一个最大值,超过这个最大值就挂起,直到其他线程结束。
 
建个堆栈吧,你不可能无限制的建立线程
 
我有一个最大线程数maxthread!
 
问题应该是线程锁定。
canTThreadList.Lock;
 
线程锁定?能说清楚点吗?
 
你的线程Create过程怎么写的?
 
算了,既然在这里不能解决问题,就结束吧!
 
就这样吧!
 
后退
顶部