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

  • 主题发起人 主题发起人 ie
  • 开始时间 开始时间
你的线程写的问题太多,在线程里面又是消息循环,既然是阻塞何必用消息循环了?
而且你接受数据的时候要看是否收到数据,你没有判断就去接受数据,导致 recv马上
出错返回,所以CPU占用100%,
 
to:张无忌
也许是,能否给个邮箱,我将代码发给你,你能否帮助我看看,谢谢!
 
sunhuiNO1@sohu.com
 
to:张无忌
邮件已发送,请接收,谢谢!
 
把 mWSocket.MultiThreaded := true;
改为 false 试试。这个属性应该怎么理解 ?
你的 Execute 代码段,同一时刻被重复执行吗 ? 如果是,请用线程方法封装 MyWSocketDataAvailable 。
while..do 中的判断即便简写也要清晰点的,姑且不讨论。
 
哈哈,有点明白了,看了ics的wsocket.pas中的一些说明:
If you have to use multithreading, you have two possibilities:
1) Create your TWSocket from your thread's Execute method
2) Attach a TWSocket to a given thread using ThreadAttach.
In both cases, you must set MultiThreaded property to TRUE.
If youdo
n't use one of those methods, you'll end up with a false
multithreaded program: all events will be processed by the main tread !
For both methods to work, you MUST have a message loop withing your thread.
Delphi create a message loop automatically for the main thread (it's in
the Forms unit), butdo
es NOT create one in a thread ! For your convenience,
TWSocket has his own MessageLoop procedure. You can use it from your thread.
Sample program MtSrv uses first method while ThrdSrv uses second method.
Sample program TcpSrv is much the same as ThrdSrv butdo
esn't use any
thread. You'll see that it is able to server a lot of simultaneous clients
as well and it is much simpler.
其实我的思路没有大的问题,问题是ics的wsocket中已经有了消息循环,就是MessageLoop
而我还用application.processmessage来进行异步,看来是多余的,而且有时可能会有些异常,
不知道是不是这个问题?不过我使用ics的http用同样的结构写的一些代码,运行一直很稳定。
看来要对程序做些修改。
 
放屁!ics 中一般应用 MultiThreaded 必须为假,这是你对 ics 的 MultiThreaded 属性的
理解有误! ics 中,这个属性是 ics 自己内部功能的一部分。
 
用嘴放的,怪不得这么臭!你每天吃大便啊!
 
骂的好,有些人就是喜欢吃屎,呵呵!
In both cases, you must set MultiThreaded property to TRUE 不是已经说明了吗
 
哈哈,这倒不是针对你说这个话,看全部帖子,在 Message Loop 里打转,都没有想去看
看源代码,ics 是有源代码的。看了你的代码,发现对 MultiThreaded 这个属性的理解好
象是按常规的 VCL 控件在构想,没有仔细注意到你这是在做 sock 编程。全部回贴也浮躁
得可以,在 DFW 已经不是一次二次了。所以我自己倒有点火。呵呵。说明部分没错,但你
的理解对吗 ? sock 是最底层的东西了,要注意到 ics 重写了 sock 单元,Message 本身
不对你的代码产生影响,关键是无效的残碎连接对你引用了 ics 自己的多线程造成了很大
的负担,这本来是网络编程中的常识,但处在更高级的编程模式时,我们接触比较少。这次
你直接使用就知道了。
为回答你这个问题,我特地把 icsdo
wn 来看了,设计者在这个东西里的设计非常有意思,
为了让它更多地被我们控制,设计者变着法把各种属性和功能暴露出来,但在在其他方面,
设计者又写得很简单,一个错误代码还是不可恢复的 ...,请不要怪我说粗话,你现在的理
解还是错的。
 
If you have to use multithreading, you have two possibilities:
1) Create your TWSocket from your thread's Execute method
2) Attach a TWSocket to a given thread using ThreadAttach.
In both cases, you must set MultiThreaded property to TRUE.
If youdo
n't use one of those methods, you'll end up with a false
multithreaded program: all events will be processed by the main tread !
关于MultiThreaded属性什么时候为true,它说的很明白了,只有当1,2条件都成立。否则就
是false。如果你只有一个TWSocket,那么就是false.你给我的代码好像是一个。
For your convenience,
TWSocket has his own MessageLoop procedure. You can use it from your thread.
你不用担心该如何做消息循环,TWsocket已经有了,你只要将它加入你的线程

这是我的理解。因为时间关系,我没有来得及看ICS代码。我说的针对你给我的代码。
 
在线程中如果不是自己建立的窗口就最好不要引入消息循环。
 
好了,我将原来的代码
while truedo
begin
//....在这里不断循环
application.processmessage;
sleep(2);
if 数据接收完 then
break;
end;

改成了wsocket.messageloop;后,运行正常,不会再出现cpu的使用率偶尔到100%的问题了。
是我对线程中的消息的理解有些问题!
to: lp414,我是简化了程序。其实是多线程的。应该是ics中说明部分的
1) Create your TWSocket from your thread's Execute method
所以,应该将multithreaded 定义为true
我对那段英文的理解是:只要是这两种情况中的一种,就应该设置为true吧,不知道我的英文理解是否有误
感谢大家,呵呵,结贴
 
后退
顶部