如何处理clientSocket OnRead事件中指令的顺序执行(同步)?(100分)

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

hellenlong

Unregistered / Unconfirmed
GUEST, unregistred user!
ClientSocket OnRead接受消息时按照指令解析所做的操作
Socket工作在NoBlocking模式下(异步)
指令
1、登录成功反馈指令,此时,需要初始化一些全局列表
2、接受消息指令,此时需要根据全局列表做相应的处理
此时,ClientSocket需要接受这两个指令做相应的处理,可是此时出现,指令1没有处理完,就处理指令2,从而由于全局列表没有初始化成功而导致程序出错。
我现在用信号源做处理,Onread的时候先waitforsingleObject,处理结束后再setEvent(hmutex)。
但是,处理指令2的时候,waitforsingleObject是在等待信号源,但是指令1缺不会处理了,程序死了。
请问我应该如何处理这种情况呢,如何让指令2等待指令1结束后处理呢?
处于NoBlocking模式的clinetSocket应该为每次OnRead开启一个线程吗?
 
在线等待,急急!!
 
版主和各位高手可以给我看看吗????[?]
 
你说的问题有点抽象,看不太明白。能否再详细一些?

事实上,TCP/IP能保证数据传输的正确性和有序性。
 
简单一点,就是这样
第一次onRead消息触发,执行初始化列表
第二次onRead消息触发,需要读取列表中的信息.
但是,执行初始化列表没有结束,第二次OnRead消息就触发了,从而需要读取列表时程序出错.
 
如果分数不够,再可以加分
各位帮帮忙
 
代码示例:
procedure TF_Main.cs_1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
waitForsingleObject(hMutex,INFINITE);
case iZl of
1:
begin
//初始化列表中
end;
2:
begin
//Recv message
//根据列表处理
end;
end;
setEvent(hMutex);
end;
 
处理过程中你是不是用了Application.ProcessMessages?
 
to:weiwei81123,
没有
 
大侠们看看,帮帮忙啊
 
建议你在OnRead事件中把数据SendMessage给F_Main。在TF_Main中映射消息。应该能解决问题的。注意是SendMessage,不是PostMessage!
 
SendMessage和PostMessage有什么区别吗?
 
触发线程PostThreadMessage(mParseThread.ThreadID,WM_PARSE,0,0)
以下为线程执行体
procedure TParseCommandThread.Execute;
var
Amsg:Msg;
commandCode:Integer;
mem:TMemoryStream;
begin
inherited;
{待调试}
while (not terminated) do
begin
GetMessage(AMsg,0,0,0);
case AMsg.message of
WM_PARSE:
begin
while mCommandList.Count >= 1 do
begin
if PCommand(mCommandList[0]).IsOk then
begin
commandCode := PCommand(mCommandList[0])^.CommandCode;
mem := PCommand(mCommandList[0])^.mem;
case commandCode of
1001:
ParseCommand1001(mem);
2001:
ParseCommand2001(mem);
3001:
ParseCommand3001(mem);
end;
mem.Free;
mCommandList.Delete(0);
end
else
Break;
end;
end;
WM_TERMINATE:Terminate;
end;
end;
end;
我现在改用上段程序来处理Socket.Onread时指令的顺序执行。
但是,一直获得AMsg.message=15,于是程序进入死循环?但是,我并没有发送这个消息啊,还有我在线程中发消息给其他线程,会不会有问题呢?
各位请帮我看看
 
后退
顶部