关于线程的问题,太奇怪了,请大家帮忙! (100分)

  • 主题发起人 主题发起人 ie
  • 开始时间 开始时间
I

ie

Unregistered / Unconfirmed
GUEST, unregistred user!
我建立一个线程,使用ics来接收数据,
procedure Execute;
override;
begin
//....
mWSocket := TWSocket.Create(nil);
mWSocket.ComponentOptions := [wsoNoReceiveLoop];
mWSocket.MultiThreaded := true;
mWSocket.OnDataAvailable := MyWSocketDataAvailable;
//...
//做些连接动作,连接上后,开始接收数据,在MyWSocketDataAvailable(Sender: TObject;
Error: Word);过程中接收数据
while truedo
begin
//....在这里不断循环
application.processmessage;
sleep(2);
if 数据接收完 then
break;
end;
//...
mWSocket.free;
end;

现在问题是,数据接收到一定时候,cpu使用率接近100%(开始cpu使用率很低),我后来发现代码不会在while truedo
中循环了,
但MyWSocketDataAvailable还是不断在接收数据。为什么?我这样写不对吗?请各位高手指点!
 
> if 数据接收完 then
break;
?????????????????????????
 
那是因为你加了APPLICATION.PROCESSMESSAGE;
加了这句话,sleep(2);就没必要了。
CPU之所以占这么大,那是因为你把while truedo
这句话放在进程中,而不是你自己建立的
线程中。不信,可以试试。[:D]
 
to : lp414
能否给点代码,这样比较好理解,谢谢!
 
to: lp414
如果我不加sleep(2),只用APPLICATION.PROCESSMESSAGE;将立即到100%,而且
MyWSocketDataAvailable中无法接收处理数据,
 
to:wlmmlw
能否说的明白些
 
有谁来给点建议啊,在线等待!
 
类似的代码可以参看spcomm控件源代码。[:D]
再看了下问题,看来你的烦恼是进程和线程搞不清楚了。。。呵呵,前段时间我也是。
至于application.processmessage只是切换控制权,不会影响你接受处理数据。
wlmmlw,这句话无所谓,我测试过。加在里面有点怪,但不会影响整体运行。
 
to:lp414
能否简单的说一下区别,我看了帮助,不就是Threads的吗,这是线程吧
 
application.processmessage是进程主控权切换。
线程是进程一部分,进程又有主分之别。主进程类似于c语言中的main,分进程也就是子进程
是某个非线程函数,比如button1.click。。。线程可以放在button1.click中完成。也可以
只是其事件代码中一部分。
详细的还是需要你自己看书或者代码来认识。
 
to:lp414
谢谢!
不过时间紧急,就2天放假了,你能否给个简单的框架。
如:我现在是使用ics的wsocket来接收数据进行处理。以上代码是我的基本思路,也许存在问题
你觉得应该怎么写。只要简单说说即可,万分感谢!
 
把你代码发到 lp414@sina.com,我先看看。
 
好,我发完,告诉你
 
to:lp414
请收邮件,谢谢!
 
ReceData 代码可以分成三部分。
第一初始化
第二检验是否连接超时
第三数据是否接受完
2,3可以归结为
while (Not fTimeOut) or (Not FRecvDataOK)do
begin
application.processmessage;//你也可以试试就;空操作
end;
 
to:lp414
可是这样,cpu的占用率就会100% :(
而且MyWSocketDataAvailable中对数据的接收和处理没有任何反应了
 
干脆自己写个组塞线程!
 
不知道是不是ics的wsocket的问题,还是我没有用对:(
现在问题的关键就是集中在:
当在while truedo
中循环等待数据,在MyWSocketDataAvailable中处理数据,
多数情况下,没有问题,cpu的使用率也都很低,但有时运行一段时间,不知道什么原因,
while truedo
中的循环不起作用了,所以cpu使用率一下到100,但
MyWSocketDataAvailable中的数据接收、处理一直在进行。:(
 
有没有人用ics的wsocket写过代码啊?
 
后退
顶部