hight speed charting 实时曲线时鼠标移动到图形区域导致假死的问题请教

hiqrf3 2016-07-04 11:31:22
使用hight speed charting 做一个小软件,实时采集数据绘制曲线。数据解析和曲线绘制都正常,但是遇到两个问题弄了很久没没法解决:

1、在绘图的过程中,如果鼠标移动到图形区域(只移动过去,不做任何点击),图形就会变成空白(坐标、网格、曲线都没有了),鼠标移开后很长一段时间都不会恢复,有时候等很久之后(甚至长达几分钟。。。)会回复,有时候就一直这样了,只能重启。

2、单独用一个线程来绘制图形,在线程中检测结束标志变量来结束进程,要结束线程时,主线程置位结束标志变量,然后等待绘图线程结束, 但是遇到问题是,主线程在等待绘图线程结束时挂起了,然后绘图线程那边好像也挂起了,不会进行循环。。。导致程序假死。 试了把绘图线程中的绘图的代码屏蔽掉,就可以正常结束线程。。。 难道hight speed charting 的绘图操作还需要挂起等待主线程的某些操作? 这个问题的代码如下:

绘图线程:

void CDebugToolDlg::RecvThreadLoop()
{
BYTE *rxbuf = new BYTE[1024];
tCOMMAND *pRxCommand = (ptCOMMAND)rxbuf;
CString str;
int ChartNum = 0;

while (1)
{
if (m_RecvThreadStopFlag)
{
delete[]rxbuf;
return;
}

if (m_pComInterface->IsOpened())
{
float fValue;

fValue = rand();

(m_pSeries)->AddPoint(m_pSeries->GetPointsCount(), fValue);
Sleep(10);
}
}
}


主线程:
void CDebugToolDlg::EnableRxThread(BOOL status)
{
if (status)
{
if (m_rxThread != INVALID_HANDLE_VALUE)
EnableRxThread(FALSE);
m_RecvThreadStopFlag = FALSE;
m_rxThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)RecvThread, this, NULL, NULL);
}
else
{
if (m_rxThread != INVALID_HANDLE_VALUE)
{
m_RecvThreadStopFlag = TRUE;
WaitForSingleObject(m_rxThread, INFINITE);
CloseHandle(m_rxThread);
m_rxThread = INVALID_HANDLE_VALUE;
}
}
}

以上两个问题,让我写的这个小工具卡壳蛮久了。。。。 我学习C++和MFC变成才个把月,对windows的很多机制并不是很了解,尝试看了hight speed charting的源码,也没看出来什么结果,希望大家帮我看看,这两个问题应该怎么解决,感激不尽!
...全文
155 点赞 收藏 3
写回复
3 条回复
赵4老师 2016年07月06日
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
回复 点赞
hiqrf3 2016年07月06日
自己找到原因了,就是因为多线程的问题,我的RecvThreadLoop是一个工作线程,不是用户线程,自己没有消息循环,所以结束线程的时候,主线程等待接收线程结束,期间不响应消息了,而接收线程的绘图操作需要等待主线程处理了某个消息(可能是paint消息什么的)才会返回,这样就导致互锁了。 至于鼠标移动过去就会卡死,调试时候还会弹出错误,也是因为线程的原因,具体细节就不是那么清楚了。 谢谢两位的回答,zhao4zhong1给的这个链接应该是可以详细了解这些问题的方法,不过太多的英文了,没精力去全看了。。。
回复 点赞
baita96 2016年07月05日
没用过这个工具,估计High speed charting本身不是线程安全的。
回复 点赞
发动态
发帖子
界面
创建于2007-09-28

7973

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告