请教 ServerSocket 回调函数的数据保护问题

rudolf_he 2006-06-04 10:23:05
ServerSocket 的 ClientRead 事件在有数据到达的时候触发。

如果处理时间过长,那么就会出现函数重入的情况。

为此需要对一些全局变量做 数据同步 的保护。

查资料知道有一个 TCriticalSection 用之

.h 里
TCriticalSection *CriticalSection;


.cpp
FormCreate 里
CriticalSection = new TCriticalSection;

ServerSocket1ClientRead 里
CriticalSection->Acquire();
//处理全局变量、数据代码
CriticalSection->Release();


但是经测试,发现 CriticalSection 并未起作用。

不知道 CreateSemaphore()、CreateEvent()、WaitForSingleObject()、ReleaseSemaphore()、SetEvent()等等 是否只能用在 线程中?

请用过的 XDJM 不吝指教

谢谢!!
...全文
395 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rudolf_he 2006-07-10
  • 打赏
  • 举报
回复
谢谢!!
rudolf_he 2006-06-06
  • 打赏
  • 举报
回复
(1)ClientRead 中有个计数器 pR ,用于记录收到多少条数据;而后判断线程是否挂起,如果挂起则重新激活线程


(2)处理线程中有一处理计数器 pW ,用于记录已处理了多少数据;线程中 pW 与 pR 比较,如果相同,说明无数据处理,线程挂起。

但是在实际运行时,线程挂起的同时,pR 的值发生了变化,导致判断出错,线程挂起后不能及时响应

也就是(2)中在准备挂起线程的时候,(1)判断线程还未挂起,未执行激活线程的代码,随后线程被挂起...
pp616 2006-06-06
  • 打赏
  • 举报
回复
ClientRead 中不要做复杂的处理。可以把收到的数据放进一个数据队列。
然后另开线程去处理数据。

1,317

社区成员

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

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