线程管理和交互问题,急!高手请进!(200分)

  • 主题发起人 主题发起人 冰火
  • 开始时间 开始时间

冰火

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个问题请教线程高手,问题描述如下:
我编了一个网络通讯程序(Server)端,底层的通讯用的别人提供的DLL(必须如此),
建立了监听的Socket后,我在一个循环中监视有无Client端的Socket连入,接下来是关键。
别人提供的范例程序用aceept查到有Client接入后,用CreateThread开了个线程,把一个
函数做为参数传进CreateThread,然后这个线程就执行该函数的代码,这段代码的任务是
调用DLL里的函数,从Socket连接上取回数据,根据数据的内容再发个包回去。
我仿照范例来作(当然是用Delphi来写),用一个类封装了这个DLL的函数。问题是线程
这一段我不知道该怎么写了。我用Delphi封装时,向我的类的调用者采用虚的过程的形式
传递信息,即当我收到某个包后,我调用对应的一个虚的Procedure,而高层则在继承的类
里实现这个Procedure,然后进行处理。
好,具体的问题是:针对这种情况,我该如何使用线程?是调用CreateThread还是用TThread
类来实现?
如果用CreateThread,我该怎么把一个方法当成参数传给CreateThread?
如果用TThread类,我是不是要维护一个线程数组(我会同时收到多个Client的Socket连接)?
我又怎样在线程里调用我的类的虚Procedure呢?
不知道我说清楚没有,我会在线上守到6:00,请各位高手不吝指点,是公司的活,很急,
帮帮忙,我先谢了。
积分不够我再加。
 
没有人愿意回答么?
 
用TThread比较好,TThread是对线程的封装,它会自动去调用CreateThread等API。
 
给你写了一段代码,按我想象大约是这样吧:
线程代码:
unit Unit2;
interface
uses
Classes;
type
//假设DLL的过程是一个整数参数Param1的过程
TMyProcProcedure = procedure(Param1: Integer) of Object;
//如果是方法:TMyProcProcedure = function(Param1: Integer): Boolean of Object;
TMyProcThread = class(TThread)
private
FProcProcedure: TMyProcProcedure;
procedure SetProcProcedure(const Value: TMyProcProcedure);
protected
procedure Execute;
override;
proceduredo
Proc;
public
property ProcProcedure: TMyProcProcedure read FProcProcedure write SetProcProcedure;
end;

implementation
{ TMyProcThread }
procedure TMyProcThread.DoProc;
begin
if Assigned(FProcProcedure) then
FProcProcedure(0);//在线程里调用类的Procedure,它才不管虚实呢
end;

procedure TMyProcThread.Execute;
begin
{ Place thread code here }
do
Proc;
//如果FProcProcedure会执行不安全的代码则改为:
//Synchronize(DoProc);
end;

procedure TMyProcThread.SetProcProcedure(const Value: TMyProcProcedure);
begin
FProcProcedure := Value;
end;

end.

调用:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TMyProcThread.Create(True)do
begin
FreeOnTerminate := True;
//把一个方法或过程当成参数传给Thread,虚方法也可以,但必须已由子类实现
ProcProcedure := MyDll.ProProcedure;

Resume;
end;
end;
 
>>我是不是要维护一个线程数组
这是另一个问题了。如果你要求线程能暂停、中止、RESET、数量限制等控制,则需要。
否则不需要。如果你愿意,我可以给你一个线程任务管理的DEMO。
>>我会在线上守到6:00
你真强,我10:00就回去睡了。
 
你的程序比较简单:
1、用TServerSocket的阻塞方式,他自己会建立线程。
2、你的DLL估计提供了2个函数
ReadSocket(ClientSocket: TServerClientWinSocket;ReadBuff:Array[0..200] of char);
WriteSocket(ClientSocket: TServerClientWinSocket;WriteBuff:Array[0..200] of char);
其实并不需要用类封装。
 
后退
顶部