如何减轻CPU的负担?(100分)

  • 主题发起人 主题发起人 hellenlong
  • 开始时间 开始时间
H

hellenlong

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己做了一个消息服务器,客户有消息来先放入消息对列
然后,建立一个线程读取队列中的消息发送,但是,这个线程运行时占了很多的CPU资源
请问,我该如何处理呢?
 
把线程的运行模式设置为空闲时运行;
 
降低线程优先级
 
怎么设置
 
线程里加入一句
SLEEP(100);
 
如果不運行的話,嘿嘿,CPU當然負擔很輕了.
 
TO 41426277:
sleep(100)时,其他线程运行吗?
 
to foresail:
我的线程要不断的发送消息的,不可以不工作,除非队列为空.
是不是可以这样,队列为空线程退出.有数据再跑线程
 
在线程里建立自己的消息循环,客户数据准备好后就给线程发消息,这样只有有数据要发送时线程才运行
 
无论你采用什么技术,CPU总是要工作。工作量较小时,CPU工作量就小。
 
TO:乡村月光
在线程里建立自己的消息循环,不是很理解,可以给段代码吗?
后来我考虑这样,有消息进入线程唤醒执行,消息为空,线程挂起.你觉的呢?[:)]
 
线程中一旦等待的时候请用:WaitForSingleObject函数挂起,唤醒时用SetEvent唤醒线程,就可以有效释放时间片了。
 
以下片段是我一个P2P程序里的例子,供参考!其中HWin是响应消息的窗口handle,WM开头的是自己定义的消息。
procedure TClientMsgThread.Execute;
var AMsg: MSG;
AGet: TGetDataThread;
begin
DoConnect; // 连接
if not Connected then // 连接失败,则清除管理对象的记录
begin
RmtMan.Buffer[RmtId].ThreadMsg := nil;
Exit;
end;
AGet := TGetDataThread.Create(RmtId, HWin, Sock, Self); // 创建数据接收线程
AGet.Resume;
PostMessage(HWin, WM_CONNECTED, RmtId, ctClient); // 通知主窗口连接成功
while not Terminated do
begin
GetMessage(AMsg, 0, 0, 0); // 取消息,没消息时不会返回,线程停止执行
case AMsg.message of // 有消息则处理
WM_DISCONNECT:
begin
AGet.Terminate; // 先通知数据接收线程结束,它会回送消息WM_TERMINATE
AGet.Resume;
end;
WM_SENDSTRS: DoSendStrs;
WM_SENDBUFFER: DoSendBuffer;
WM_RESUMEGET: AGet.Resume;
WM_TERMINATE: Terminate;
WM_ERRORONGET:
begin
PostMessage(HWin, WM_NETERROR, RmtId, eSendData); // 接收数据出现错误
Terminate;
end;
end;
end;
PostMessage(HWin, WM_DISCONNECTED, RmtId, ctClient); // 通知窗口连接已经断开
RmtMan.Buffer[RmtId].ThreadMsg := nil;
Sock.CloseSocket;
end;
 
TClientMsgThread这个也不是一直运行吗?
也要占用CPU资源的吗?
 
执行GetMessage的时候,如果没有属于线程的消息,该函数不会返回,控制权交回给操作系统,线程不会被执行,直到有消息到来
 
这样给SendNewsThread发消息
PostMessage(SendNewsThread.Handle,WM_SENDBUFFER,0,0);
但是,
inherited;
while not terminated do
begin
GetMessage(AMsg,0,0,0);这儿始终接不到消息,为什么???????
case AMsg.message of
 
给线程发消息要用PostThreadMessage, 不能用PostMessage,后者只能给窗口发消息,注意PostThreadMessage的第一个参数是ThreadID,不是Handle
 
给你一段应用的例子:
procedure TRemoteManager.SendBuffer(i: Integer);
begin
if i >= FBufSize then Exit;
if (not FBuffer.IsUsed) or ((FBuffer.ConnectState <> csIsClient) and
(FBuffer.ConnectState <> csIsServer)) then Exit;
if Assigned(FBuffer.ThreadMsg) then
begin
FBuffer.Sending := FBuffer.Sending + [stBuffer];
PostThreadMessage(FBuffer.ThreadMsg.ThreadID, WM_SENDBUFFER, 0, 0);
end;
end;
 
后退
顶部