我的Clientsocket是动态创建的,我想让它和FORM无关,可是ONREAD怎么写?(200分)

  • 主题发起人 主题发起人 Milpas
  • 开始时间 开始时间
M

Milpas

Unregistered / Unconfirmed
GUEST, unregistred user!
不能动态创建一个EVENT吧?
 
procedure xxxx(sender:object)
begin
xxxxxxxxx;
end;

clientsocket.onread:=xxxx;
 
随便找一个类,比如你的form就可以,里面加一个方法(要在类里面,不能作为全局函数)
procedure sock_onread(Sender: TObject; Socket: TCustomWinSocket);

赋值: clientsocket.OnRead:=sock_onread;
 
to dhl2001:
我是想在一个过程里创建ClientSocket,然后由多个线程调用,我希望每个cs都指向它自己的onread事件。
你的方法解决不了啊。

to Pipi:
我是想做成和Form无关的Procedure,你的写法不行啊,好象一定要加:TForm
procedure TForm1.sock_onread(Sender: TObject; Socket: TCustomWinSocket);
 
我都说了,要在类里面,不能作为全局函数
不过这个类不一定必须TForm,可以是TThread、TDataModule、之类的,你自己定义一个类都可以的
但是一定要作为某个对象的方法!
 
to Pipi:

我在线程里边用,不行啊,帮我看看:
Type
TcmThread = class(TThread)

procedure TcmThread.xxxxx;
var
csk:TClientSocket;
begin
csk:=TClientSocket.Create(Self);
......
end;

错误提示是:
Incompatible types:'TComponent' and 'TcmThread'
 
奇怪,为什么我在线程里用的是NotBlocking模式,它却不触发ONREAD事件呢?
 
我说的是事件,那个事件的过程要在类里面
而你说的是create,这样
TClientSocket.Create(nil)
 
OnRead在线程里边好象不起作用?
 
你有没有
clientsocket.OnRead:=你的onread过程
 
好像在线程中不能用onRead,而且TClientSocket有阻塞和非阻塞方式,如果是非阻塞方式用
线程没什么用处(个人感觉),一般在阻塞方式才用线程,而阻塞方式的ClientSocket在线程
接收用TWinSocketStream来waitfor, read ,write
 
是了,如果是用nonBlocking的,需要处理消息,即线程自己的消息队列
 
pipi是阻塞方式才是吧,如果非阻塞的话,它是基本消息驱动的,建立对它没什么用,
而且还要在线程中处理消息,阻塞方式是需要自己去建立消息队列,并等待数据的到来进而
读写操作
 
阻塞方式不需要消息
非阻塞方式是世界爱你驱动的,所有要有消息处理
 
问题已经解决了,非阻塞要用Appliction.ProcessMessage才会触发OnRead.

用Blocking方式,然后用 TWinSocketStream来取返回值好象老取不对?

另外sendText为什么都要在字符后面加#13#10才行,否则没返回?
 
没有人愿意讨论了???
 
read ,write.
在socket里的OnGetThread事件里创建TWinSocketStream,然后用read ,write试试.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
897
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
854
DelphiTeacher的专栏
D
D
回复
0
查看
829
DelphiTeacher的专栏
D
后退
顶部