有详细得代码介绍!请教+探讨TIDUDPServer多线程处理得问题,非常急啊,严重丢数据!up有分

huzhangyou 2007-03-23 09:22:20
下面我说一下我的问题:
由于做得视频处理,所以包如果丢了,就显示不了数据了!
大家先看一下这个我设计得多线程类!
void __fastcall TUDPThread::Execute()
{
idUDPS->Active = true;
while(Runed && idUDPS->Active){
try{
try{
idUDPS->OnUDPRead = RecvPacket;

}catch(Exception &E){
Server->cs->Enter();
Server->log->WriteLog1("Error1");
Server->cs->Leave();
}
}
__finally{

}
if (!Runed)
break;
else{
Sleep((unsigned long)1);
}
}
}
//---------------------------------------------------------------------------
__fastcall TUDPThread::TUDPThread(TIdUDPServer * idUDPB, bool CreateSuspended)
: TThread(CreateSuspended)
{

idUDPS = idUDPB;
Runed = true;
}

__fastcall TUDPThread::~TUDPThread()
{

}

void __fastcall TUDPThread::RecvPacket(System::TObject* Sender, Classes::TStream* AData, Idsockethandle::TIdSocketHandle* ABinding){
char *bufData = new char[MaxSize];
memset(bufData,0,MaxSize);
int r = AData->Size;
AData->Read(bufData,r);

Server->log->WriteLog1("TUDPThread GetPackage ....................");
TVideoMemroyBlock *vmb = new TVideoMemroyBlock(bufData,r);
Server->cs->Enter();
Server->pVideoMBListV[0].push_back(vmb);
Server->cs->Leave();
delete []bufData;

}

这是处理线程

class TUDPThread : public TThread
{
private:
volatile bool Runed;
protected:
void __fastcall Execute();
public:
//char *bufData;
TIdUDPServer *idUDPS;
__fastcall TUDPThread(TIdUDPServer * idUDPB, bool CreateSuspended);
__fastcall ~TUDPThread();
__fastcall TUDPThread(bool CreateSuspended);
void __fastcall RecvPacket(System::TObject* Sender, Classes::TStream* AData, Idsockethandle::TIdSocketHandle* ABinding);
};
这是定义!

下面是我得问题:
服务器在接收包得时候,一切正常,但是

大家请注意
Sleep((unsigned long)1);这一句语句导致了我检测数据得时候
发现丢了大概3个包,!

我得问题:
想请教大家这里应该如何设计
才能保证不丢包!
我开始想
不用Sleep((unsigned long)1);
而使用this->Suspend();
但是问题也来了,挂起以后,谁来唤醒她?


征集好得解决方法或者思路,只要能够解决问题,分不是问题!

可以再开贴!非常着集!

再次感谢!
...全文
313 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2008-03-19
  • 打赏
  • 举报
回复
up
daily66 2007-03-24
  • 打赏
  • 举报
回复
顶了,
接分
信念 2007-03-24
  • 打赏
  • 举报
回复
不熟,JF为主
Waiting4you 2007-03-24
  • 打赏
  • 举报
回复
回:
///////////////////////
说 还差多少分 2个星星
///////////////////////


偶还差10000-8402=1598分, huzhangyou兄不会一冲动把分全倒给偶了吧?嘻嘻
huzhangyou 2007-03-24
  • 打赏
  • 举报
回复
你已经在8个小时以前采用了你的这个方法
错了

我已经在8个小时以前采用了你的这个方法
huzhangyou 2007-03-24
  • 打赏
  • 举报
回复
呵呵
to 毛毛:你来的真晚啊
你已经在8个小时以前采用了你的这个方法

呵呵 不过还是非常感谢了
我就是要等一个答案
呵呵~~~

说 还差多少分 2个星星
Waiting4you 2007-03-24
  • 打赏
  • 举报
回复
没看得很懂,主要是这个多线程类的作用是什么? 不断地执行idUDPS->OnUDPRead = RecvPacket;是为啥子呀?

偶建议多线程还是这样做(针对数据处理比较慢的情况):

idUDPS->OnUDPRead事件直接在设计期绑定,此事件代码为把收到的数据放到一个队列里

新建一线程,此线程的目的是查看队列是否有数据,有的话执行你上面PecvPacket里的代码,没有的话Sleep或Suspend(可以由OnUDPRead来唤醒),只要控制好互斥量,应该没问题的.

不过从楼主的代码看好像PecvPacket里的代码不算很费时啊,单线程应该也行吧.
ly_liuyang 2007-03-23
  • 打赏
  • 举报
回复
为什么要Sleep啊?
我做视频系统用TCP的,可靠呢
采用TCP动态调整速率方法,自动跳贞~
daily66 2007-03-23
  • 打赏
  • 举报
回复
再来,再顶,接分
偶不懂IY
daily66 2007-03-23
  • 打赏
  • 举报
回复
沙发!顶了,接分

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧