PUDPRecvData = ^TUDPRecvData;
TUDPRecvData = record
Data: array[0..MAX_RECVBUF] of Byte;
DataCnt: Integer;
IP: array[0..15] of Char;
Port: Integer;
end;
procedure TfrmMain.UDPServerPBXUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
iCnt, i: Integer;
// sStr: string;
lUDPRecvData: PUDPRecvData;
begin
lUDPRecvData := New(PUDPRecvData);
iCnt := AData.Read(lUDPRecvData^.Data[0], AData.Size);
lUDPRecvData^.DataCnt := iCnt;
CopyMemory(@lUDPRecvData^.IP[0], @ABinding.PeerIP[1], 16);
lUDPRecvData^.Port := ABinding.PeerPort;
gRecvDataList.Push(lUDPRecvData); //gRecvDataList是个队列// if UDPDataDealwithThread.Suspended then
UDPDataDealwithThread.Resume;
end;数据收下来后,存在队列里,然后开线程去队列取出数据,做相应的处理
procedure TUDPDataDealwithThread.Execute;
var
lUDPRecvData: PUDPRecvData;
begin
repeat
if gRecvDataList.Count > 0 then
begin
lUDPRecvData := gRecvDataList.Pop; fPointer := 0;
while (fPointer < lUDPRecvData^.DataCnt) do
begin
if Analyse(lUDPRecvData^.Data, lUDPRecvData^.DataCnt) then
begin
//显示调试信息
DealWith(lUDPRecvData^.IP, lUDPRecvData^.Port);
end;
end;// try
Dispose(lUDPRecvData); //接收数据后,有时候会报指针错误/
// except
// ShowMessage('7');
// end;
end
else UDPDataDealwithThread.Suspend;
until Terminated;
end; Dispose(lUDPRecvData); //接收数据后,有时候会报指针错误/
百思不得其解?大家帮忙找找问题没有其他的线程操作,队列就这两个地方用。
TUDPRecvData = record
Data: array[0..MAX_RECVBUF] of Byte;
DataCnt: Integer;
IP: array[0..15] of Char;
Port: Integer;
end;
procedure TfrmMain.UDPServerPBXUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
iCnt, i: Integer;
// sStr: string;
lUDPRecvData: PUDPRecvData;
begin
lUDPRecvData := New(PUDPRecvData);
iCnt := AData.Read(lUDPRecvData^.Data[0], AData.Size);
lUDPRecvData^.DataCnt := iCnt;
CopyMemory(@lUDPRecvData^.IP[0], @ABinding.PeerIP[1], 16);
lUDPRecvData^.Port := ABinding.PeerPort;
gRecvDataList.Push(lUDPRecvData); //gRecvDataList是个队列// if UDPDataDealwithThread.Suspended then
UDPDataDealwithThread.Resume;
end;数据收下来后,存在队列里,然后开线程去队列取出数据,做相应的处理
procedure TUDPDataDealwithThread.Execute;
var
lUDPRecvData: PUDPRecvData;
begin
repeat
if gRecvDataList.Count > 0 then
begin
lUDPRecvData := gRecvDataList.Pop; fPointer := 0;
while (fPointer < lUDPRecvData^.DataCnt) do
begin
if Analyse(lUDPRecvData^.Data, lUDPRecvData^.DataCnt) then
begin
//显示调试信息
DealWith(lUDPRecvData^.IP, lUDPRecvData^.Port);
end;
end;// try
Dispose(lUDPRecvData); //接收数据后,有时候会报指针错误/
// except
// ShowMessage('7');
// end;
end
else UDPDataDealwithThread.Suspend;
until Terminated;
end; Dispose(lUDPRecvData); //接收数据后,有时候会报指针错误/
百思不得其解?大家帮忙找找问题没有其他的线程操作,队列就这两个地方用。
解决方案 »
- 你妹啊,密码居然真被偷了,愤怒ing
- Delphi使用CodeSoft模板
- 如果取消修改TreeNode?
- 简单问题
- 怎么为paradox7建立数据源
- 请问如何交换StringGrid中的指定行和列,是使用编码的方式不是设置属性!
- 一直对FOR循环语句不太熟练,前辈门能举些好例子让后辈真正认识这种语句的威力吗
- 怎么横量一个开发人员的工作量(大家谈谈自己的看法,来者有分)
- 用batchmove怎么把一个表的每条纪录选择两个字段复制到一个表里边呢?
- 如何在WIN2000下正确设置系统时间?
- mmtools控件出现Unable to Load MMUTIL32.DLL怎么回事啊
- 屏蔽WebBrowser页面中的声音
一个线程分配,另一个线程释放?
因为你不能保证你在处理数据的线程正在pop的时候,接收线程不能push,也就是说,在同一个时刻,对这个队列可能既pop又push
你可以考虑使用TThreadList,至少他能保证多线程之间是安全的。还有这句
iCnt := AData.Read(lUDPRecvData^.Data[0], AData.Size);
你是否能保证 AData.Size一定小于MAX_RECVBUF,
如果比MAX_RECVBUF大,大多少?是否超出了SizeOf(TUDPRecvData)以上两点都有可能导致pop出来的指针是错误的
这里我有判断大小,我没贴出来
现在知道,应该是两个线程如何同步的问题,谢谢。