请教 ServerSocket 回调函数的数据保护问题
ServerSocket 的 ClientRead 事件在有数据到达的时候触发。
如果处理时间过长,那么就会出现函数重入的情况。
为此需要对一些全局变量做 数据同步 的保护。
查资料知道有一个 TCriticalSection 用之
.h 里
TCriticalSection *CriticalSection;
.cpp
FormCreate 里
CriticalSection = new TCriticalSection;
ServerSocket1ClientRead 里
CriticalSection->Acquire();
//处理全局变量、数据代码
CriticalSection->Release();
但是经测试,发现 CriticalSection 并未起作用。
不知道 CreateSemaphore()、CreateEvent()、WaitForSingleObject()、ReleaseSemaphore()、SetEvent()等等 是否只能用在 线程中?
请用过的 XDJM 不吝指教
谢谢!!
问题点数:50、回复次数:3Top
1 楼pp616(坏蛋)回复于 2006-06-06 12:15:41 得分 50
ClientRead 中不要做复杂的处理。可以把收到的数据放进一个数据队列。
然后另开线程去处理数据。Top
2 楼rudolf_he()回复于 2006-06-06 12:50:08 得分 0
(1)ClientRead 中有个计数器 pR ,用于记录收到多少条数据;而后判断线程是否挂起,如果挂起则重新激活线程
(2)处理线程中有一处理计数器 pW ,用于记录已处理了多少数据;线程中 pW 与 pR 比较,如果相同,说明无数据处理,线程挂起。
但是在实际运行时,线程挂起的同时,pR 的值发生了变化,导致判断出错,线程挂起后不能及时响应
也就是(2)中在准备挂起线程的时候,(1)判断线程还未挂起,未执行激活线程的代码,随后线程被挂起...Top
3 楼rudolf_he()回复于 2006-07-10 08:09:35 得分 0
谢谢!!Top




