lastyaer 发表于 2011-3-18 14:03:51

【求助】MFC用分线程无法调用MATLAB_VC绘图类的实例

本帖最后由 lastyaer 于 2011-3-18 14:05 编辑

求助,谢谢各位! 如下问题:
shunfly的帖子“写了个MATLAB VC绘图类”,(http://forum.simwe.com/viewthread.php?tid=779324&extra=&highlight=%D0%B4%C1%CB%B8%F6MATLAB%2BVC%BB%E6%CD%BC%C0%E0&page=2)拜读以后激动万分,在这个基础上写了一个MATLAB VC绘图类CMATLABDLG,原理完全相同,只是把matlab fig嵌在dialog中,作为该类的显示资源。

主程序是MFC 单文档模式,定义了一个成员变量:
CMATLABDLGm_matdlg;
将m_matdlg嵌在view视图中,然后调用绘图函数
int func1()
{ .....
Vplot(x, y, mwArray("Parent"), m_matdlg.m_hAxis);
...}
m_hAxis为axes句柄。运行正常。

但是如果用分线程调用func1(),报错
开启分线程:
CWinThread *pThread=AfxBeginThread(Thread1,this);

UINT CMatlabView::Thread1(LPVOID lpParameter)
{
CMatlabView *pView=(CMatlabView *)lpParameter;
pView->func1();
return 1;
}

分线程的调用方式没问题,只要不涉及m_matdlg的函数都运行正常。
错误提示:
Runtime Error!
Program: E:/..../MatLab.exe
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

后来看网上有些资料说分线程调用函数和对象时,要使用静态或全局对象,把m_matdlg改成全局对象后依然报错,错误提示相同。

不知道怎么办了,求助给位,第一次发帖求助,不知道问题说清楚没有.......

我的本意是做一个MFC界面,嵌入几个MATLAB视图,功能是接收即时数据处理并作图显示,开启几个分线程处理即时数据并作图显示,因为计算比较费时间,单线程无法即时完成,所以使用多线程。处理数据没问题,只是最后要作图时必须调用绘图类对象。求助!!谢谢各位了......

lastyaer 发表于 2011-3-22 13:09:49

1# lastyaer

没找到太准确的原因,貌似解决了。
分线程调用Vplot(......)的时候,matlab subfigure窗口即时收到WM_PAINT 消息,但是回调函数响应这个消息就报错。解决办法是
分线程调用
g_CMutex.lock();
m_MatDlg.showwindow(SW_HIDE);
Vplot(......);
m_MatDlg.showwindow(SW_SHOW);
m_MatDlg.updatewindow();//matlab subfigure窗口在该行完成后收到消息
g_CMutex.unlock();

实验结果,20个分线程同时开启并在三个figure窗口上画图,目前没有报错。

ibrave 发表于 2011-5-27 09:42:36

确实,我在使用线程实时绘图的过程中,也会出现Runtime Error错误!目前使用使用定时器来完成动态绘图的工作。可以研究一下多线程动态绘制出现错误的原因!
页: [1]
查看完整版本: 【求助】MFC用分线程无法调用MATLAB_VC绘图类的实例