64,651
社区成员
发帖
与我相关
我的任务
分享
void CALLBACK WorkCallBack(PTP_CALLBACK_INSTANCE instance, PVOID context, PTP_WORK work)
void myfun()
{
const my_block* pblock = new my_block(block);
auto workItem = CreateThreadpoolWork(WorkCallBack, (PVOID) pblock, NULL);
SubmitThreadpoolWork(workItem);
CloseThreadpoolWork(workItem);
}
int PutToRBuf(int cn, CRITICAL_SECTION *cs, FIFO_BUFFER *fbuf, char *buf, int len) {
int lent;
Lock(cs);
lent = len;//先假定本次能放进缓冲区的字节数lent=想要放进缓冲区的字节数len
if (fbuf->size + lent > BSIZE) {//缓冲区中数据当前字节数+要放进缓冲区的字节数>缓冲区最多能容纳字节数
lent = BSIZE - fbuf->size;//重新计算本次能放进缓冲区的字节数lent
}
if (fbuf->tail + lent > BSIZE) {//缓冲区中数据尾部对应字节偏移量+本次能放进缓冲区的字节数>缓冲区最多能容纳字节数
//将本次能放进缓冲区的字节分两段,
int len1 = BSIZE - fbuf->tail;//第一段长度len1
memcpy(fbuf->data + fbuf->tail, buf, len1);//第一段放在缓冲区中数据尾部之后
int len2 = lent - len1;//第二段长度len2
memcpy(fbuf->data, buf + len1, len2);//第二段放在缓冲区开始
fbuf->tail = len2;//新数据尾部偏移量=len2
} else {//缓冲区中数据尾部对应字节偏移量+要放进缓冲区的字节数<=缓冲区最多能容纳字节数
memcpy(fbuf->data + fbuf->tail, buf, lent);//将本次能放进缓冲区的字节不用分两段,直接放在缓冲区中数据尾部之后
fbuf->tail += lent;//新数据尾部偏移量=旧数据尾部偏移量+lent
}
fbuf->size += lent;//新缓冲区中数据当前字节数=旧缓冲区中数据当前字节数+lent
Unlock(cs);
return lent;//返回本次实际放进缓冲区的字节数(0..len)
}
MYVOID thdB(void *pcn) {
char *recv_buf;
int recv_nbytes;
int cn;
int wc;
int pb;
cn = (int) pcn;
Log("%03d thdB thread begin...\n", cn);
while (1) {
sleep_ms(10);
recv_buf = (char *) g_bufferC;
recv_nbytes = CSIZE;
wc = 0;
while (1) {
Sleep(1000); //假设读的人没那么及时
pb = GetFromRBuf(cn, &cs_BBB, &g_fifo_buffer, recv_buf, recv_nbytes);
if (pb) {
Log("%03d recv %d bytes\n", cn, pb);
HexDump(cn, recv_buf, pb);
sleep_ms(1);
} else {
sleep_ms(1000);
}
if (No_Loop) break;//
wc++;
if (wc > 3600) Log("%03d %d==wc>3600!\n", cn, wc);
}
if (No_Loop) break;//
}
#ifndef WIN32
pthread_exit(NULL);
#endif
}
//这里没修改,只是注释和命名整理
int PutToRBuf(int cn, CRITICAL_SECTION *cs, FIFO_BUFFER *fbuf, char *buf, int len) {
int lent;
Lock(cs);
lent = len;
if (fbuf->size + lent > BSIZE) {
//肯定装不下,截断,只装前面部分
lent = BSIZE - fbuf->size;
}
if (fbuf->tail + lent > BSIZE) {
//这时候缓冲区满了,装不下,再截断
int len1 = BSIZE - fbuf->tail;
memcpy(fbuf->data + fbuf->tail, buf, len1);
//然后把剩下的写到开头
int len2 = lent - len1;
memcpy(fbuf->data, buf + len1, len2);
fbuf->tail = len2;
} else {
memcpy(fbuf->data + fbuf->tail, buf, lent);
fbuf->tail += lent;
}
// 这里没法理解了, lent = BSIZE - fbuf->size的话,
// 那么 fbuf->size + lent = BSIZE
// 那么,下次 lent = BSIZE - fbuf->size;
// lent = 0 了
// 如果 对方读得比较满的话,就再也没法写东西进去了
fbuf->size += lent;
Unlock(cs);
return lent;
}