socket接收的数据显示有问题 监测仪采集一个正弦信号,然后通过socket发送给PC,在采样频率较低时是可以正常显示的,但是高频时就显示不对了,只显示了很短一部分,而且还很乱。我在接收数据后面加了 一个sleep(3000),图像就能正常显示了,大家帮忙分析一下可能是怎么回事呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是每接收完一次数据sleep(3000),就能正常显示,搞不清楚为什么会这样 //接收数据线程接收数据sleep(3000);PostMessage();//通知绘图线程刷新图像 如果你不Sleep,cpu都让接收线程占了,绘图线程当然就工作不正常了另外数据一定要保存起来,数组,链表,队列都可以,接收线程只管接收,保存数据,不作处理绘图线程就取数据显示就行了 对 你让接受套接字接受玩指定的数据后 发送一个消息给绘图线程 这样可以提高cpu的使用效率的吗 To Conry:首先谢谢你的回复!你说的cpu都让接收线程占了,其实我也怀疑这一点,但是我采用的是线程同步机制,怎么会有CPU被接收线程占用这个问题呢?我的线程同步是这样设计的:三个线程:UINT Recvdata(LPVOID pParam)UINT Storedata(LPVOID pParam)例外一个绘图线程是用的主线程UINT Recvdata(LPVOID pParam){ while(1) { WaitForMultipleObjects(2, Finish, true, INFINITE); //开始接收数据 //接收完毕 EventStore.SetEvent();//设置 保存线程有信号 PostMessage();//通知绘图线程刷新图像 }}其中HANDLE Finish[]={EventDrawed,EventStored};//绘图、保存都结束 然后在保存线程中,UINT Storedata(LPVOID pParam){ while(1) { WaitForSingleObject(EventStore, INFINITE); //等待EventStore有信号 } EventStored.SetEvent();//设置EventStored有信号 } 绘图是在OnPaint()函数中:void CGraphDlg::OnPaint() { //开始绘图 //绘图完毕 EventDrawed.SetEvent();//设置EventDrawed有信号 }然后一个消息响应函数OnRecvDataOK响应接收线程中发过来的刷新的消息,刷新界面LRESULT CGraphDlg::OnRecvDataOK(WPARAM wParam, LPARAM lParam){ Invalidate();//刷新 } 我这样分包可以吗?不好意思,没做过分包 for( j=0; j<recvdatalen/4; j++) { *(pShareBuf+j) = *(ptmp+j); } for( j=recvdatalen/4+1; j<recvdatalen/2; j++) { *(pShareBuf+j) = *(ptmp+j); } for( j=recvdatalen/2+1; j<recvdatalen*3/4; j++) { *(pShareBuf+j) = *(ptmp+j); } for( j=recvdatalen*3/4+1; j<recvdatalen; j++) { *(pShareBuf+j) = *(ptmp+j); } //把pShareBuf发送出去 我刚才测试了一下,还是不行啊,你看看我这样写对吗?定义了一个全局的dataPart,用来记录分割的数据块。我把接收到的数据分成了4块然后分四次发送出去 for( j=(recvdatalen/4)*dataPart; j<(recvdatalen/4)*dataPart+recvdatalen/4; j++) { *(pShareBuf+j) = *(ptmp+j); } dataPart++; //发送数据当dataPart=0时,发送第一块,以此类推保存线程里面for( i=(recvdatalen/4)*(dataPart-1); i<(recvdatalen/4)*(dataPart-1)+recvdatalen/4; i++) { *(pStoreBuf_M1_C1+i) = *(pShareBuf_M1_C1+i); } while(dataPart==5) { dataPart=0;每次接收的数据都放入一个数组中,当4次接收完之后,再进行保存处理。不知是我哪里操作的不对,感觉程序运行结果跟原来的没啥两样,到底哪里还有问题呢? 明显是你的绘图线程效率太低你每收到一次数据就PostMessage给绘图线程当你绘图线程中绘图函数所需的运行时间大于PostMessage的间隔时间的话,当然显示效果会紊乱解决办法只有两个:1、在PostMessage之间Sleep2、优化绘图函数算法,降低其时间复杂度2才是根本的解决办法 不是吧我测过接收、保存、绘图三个部分的运行时间,频率20khz\保存时间10s:(显示、保存不正常)recv:700ms左右draw:150ms左右store:280ms左右PostMessage时间间隔:1700ms频率200hz\保存时间10s:(显示、保存正常)recv:13000ms左右draw:120-150ms左右store:70ms左右PostMessage时间间隔:20000ms有一点你说的很正确,就是在postMessage之前Sleep(3000),确实是可以显示、保存出来(虽然有部分数据丢失)。但是你说,是由于绘图时间过长,大于PostMessage,这个我测量过,应该不会是这个问题吧?还请多多指教,谢谢 感觉你的线程同步逻辑有些乱你的DrawEvent和StoreEvent都只调用过SetEvent方法,没调用过ResetEvent方法这两个信号量岂不是一直有信号的??? 关于vc6.0读取EXCEL2003的问题,急!急!急! 线程局部存储(TLS)是如何实现的? 求助,在VC中,如何弹出软键盘? 请问二个问题 菜鸟求救!!!!!!!! 字符串转换达人进啊,小妹有问题问啊,给100分了呀,最高分了 请问大家都是用什么东东看的电子书 请问如何自画CSliderCtrl控件 再请教 如何自己用 API 封装一个窗口类? wndpro 必须定义成 static ? MFC 是如何实现的? 有没人做过在XP下连接无线网络的功能????? 关于字符串分割的问题
接收数据
sleep(3000);
PostMessage();//通知绘图线程刷新图像
另外数据一定要保存起来,数组,链表,队列都可以,
接收线程只管接收,保存数据,不作处理
绘图线程就取数据显示就行了
首先谢谢你的回复!
你说的cpu都让接收线程占了,其实我也怀疑这一点,但是我采用的是线程同步机制,怎么会有CPU被接收线程占用这个问题呢?
我的线程同步是这样设计的:三个线程:
UINT Recvdata(LPVOID pParam)
UINT Storedata(LPVOID pParam)例外一个绘图线程是用的主线程UINT Recvdata(LPVOID pParam)
{
while(1)
{
WaitForMultipleObjects(2, Finish, true, INFINITE);
//开始接收数据
//接收完毕
EventStore.SetEvent();//设置 保存线程有信号
PostMessage();//通知绘图线程刷新图像
}
}其中
HANDLE Finish[]={EventDrawed,EventStored};//绘图、保存都结束
UINT Storedata(LPVOID pParam)
{
while(1)
{
WaitForSingleObject(EventStore, INFINITE); //等待EventStore有信号
}
EventStored.SetEvent();//设置EventStored有信号
}
void CGraphDlg::OnPaint()
{
//开始绘图
//绘图完毕
EventDrawed.SetEvent();//设置EventDrawed有信号
}然后一个消息响应函数OnRecvDataOK响应接收线程中发过来的刷新的消息,刷新界面
LRESULT CGraphDlg::OnRecvDataOK(WPARAM wParam, LPARAM lParam)
{
Invalidate();//刷新
}
for( j=0; j<recvdatalen/4; j++)
{
*(pShareBuf+j) = *(ptmp+j);
}
for( j=recvdatalen/4+1; j<recvdatalen/2; j++)
{
*(pShareBuf+j) = *(ptmp+j);
}
for( j=recvdatalen/2+1; j<recvdatalen*3/4; j++)
{
*(pShareBuf+j) = *(ptmp+j);
}
for( j=recvdatalen*3/4+1; j<recvdatalen; j++)
{
*(pShareBuf+j) = *(ptmp+j);
} //把pShareBuf发送出去
我把接收到的数据分成了4块
然后分四次发送出去
for( j=(recvdatalen/4)*dataPart; j<(recvdatalen/4)*dataPart+recvdatalen/4; j++)
{
*(pShareBuf+j) = *(ptmp+j);
}
dataPart++;
//发送数据当dataPart=0时,发送第一块,以此类推保存线程里面for( i=(recvdatalen/4)*(dataPart-1); i<(recvdatalen/4)*(dataPart-1)+recvdatalen/4; i++)
{
*(pStoreBuf_M1_C1+i) = *(pShareBuf_M1_C1+i);
}
while(dataPart==5)
{
dataPart=0;每次接收的数据都放入一个数组中,当4次接收完之后,再进行保存处理。不知是我哪里操作的不对,感觉程序运行结果跟原来的没啥两样,到底哪里还有问题呢?
当你绘图线程中绘图函数所需的运行时间大于PostMessage的间隔时间的话,当然显示效果会紊乱解决办法只有两个:1、在PostMessage之间Sleep
2、优化绘图函数算法,降低其时间复杂度2才是根本的解决办法
不是吧
我测过接收、保存、绘图三个部分的运行时间,频率20khz\保存时间10s:(显示、保存不正常)recv:700ms左右
draw:150ms左右
store:280ms左右
PostMessage时间间隔:1700ms
频率200hz\保存时间10s:(显示、保存正常)recv:13000ms左右
draw:120-150ms左右
store:70ms左右
PostMessage时间间隔:20000ms
有一点你说的很正确,就是在postMessage之前Sleep(3000),确实是可以显示、保存出来(虽然有部分数据丢失)。但是你说,是由于绘图时间过长,大于PostMessage,这个我测量过,应该不会是这个问题吧?还请多多指教,谢谢
这两个信号量岂不是一直有信号的???