一个关于Socket通信的多线程问题!!!(200分)

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

ccoomm

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]我做了一个通信程序,里面有两个ClientSocket,工作原理:ClientSocket1接收前台的
请求信息,通信程序作一些处理后,由ClientSocket2转发给远程前置机;ClentSocket2接收
远程前置机返回的信息,通信程序作一些数据库处理后,由ClientSocket1转发给前台。由于
前台很多,请求很多,我想使用多线程来改善速度。我想:当前台有一个信息过来,我就建一
个线程完成收发功能。现在的问题是,线程一般建多少个为宜?一定要用Session控件吗?
我现在的程序是通过存储过程写表的,如果象我所想那样动态创建线程,代码该怎样写?如果
N个线程完成同样的事情,那么这N个线程需要分别用N组不同的数据控件吗?还有,象我这样的
程序,用多线程合适吗?(不好意思,对多线程不了解,如果问题太菜,请原谅!)
 
建议服务端改为serversocket,不需要设置两个,一个就行了;客户前台机采用
ClientSocket
然后将serversocket改为阻塞通讯模式(即多线程),搜索一下以前的帖子找找例程;
serversocket的ThreadCacheSize属性即允许同时处理的线程个数,理论上应该是有
多少前置机就应设置多少线程
 
一言难尽,建议一本书<<windows网络编程技术>>
 
我只能用两个ClientSocket,因为我不是直接跟前台连,而是通过另外的中转程序实现跟前
台的一对多连接。而跟远程的也只能用ClientSocket,因为我们属于不同的公司,他们是
数据库的拥有者!
 
你的问题描述的太模糊!一点不像个程序员!
问题1:你的前台的数据到底是怎么传送给ClientSocket1的?
如果在你的架构中,每个前台都是一个serversocket,那你不得不创建相应多个
clientsocket1来对应。另外,clientsocket2是只负责自己对应的clientsocket1
还是负责所有的clientsocket1 ? 如果只负责自己的clientsocket1,那么就不用
创建线程了,为每个clientsocket1创建对应的clientsocket2就行了。如果负责
所有的clientsocket1,那么就可以只用一个clientsocket2,然后在OnRead事件
里面动态创建线程,在线程里面处理数据.
问题2:既然你的数据库不在本地,你是怎么操作的?我看你的描述里面只有网络通讯,
没涉及到数据库啊!和Session就更扯不上关系了.
 
to 一个过客:我对数据的处理就包括写表跟存储过程。我做的这部分只是总个系统的一部分,
我不管前面的应用程序怎样操作,我只负责不停地接受从前台发送过来的数据包,然后读数
据库,打包,转发给B点;另一端不停的接受从B点发送过来的数据包,解包,写数据库,转发
给前台。我们有我们的数据库,B点有它自己的数据库。
 
我想请教大家:
多个客户端,用clientsocket 向中间服务器Server1发送数据,Server1用ServerSocket
接收数据,数据验证合法后,然后由中间服务器用自己的 Clentsocket
发送给上层服务器,如何用线程在中间服务器上(多个Clentsocket )实现 数据的转发
 
[?]其实,我只想知道一件事情:如果我n个线程都是干同样的事情,而我是通过第三方控件
连接数据库的。如果我每个线程都要用一个Query查询月份,那么,我这N个线程可以用同样
一个Query吗?还是要用N个Query?
 
这n个线程当然可以共用一个TQuery控件,但是对TQuery控件使用时必须同步。
 
我现在使用线程数组,当我接收到数据,就自动建立一个线程来处理(其中的所有要使用的
控件都是动态生成的)。可是现在有新问题:我把数组的最长长度设为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;
 
就这样吧,问题还是让我自己解决,分数好象不知道怎么分,又懒得收回来,算了!
 
后退
顶部