程序是单文档结构,我在主框架工具栏按钮响应函数中创建了一个线程,
想在线程中先获取文档指针,再访问一个文档类里的一个变量。
在获取文档指针时程序崩溃,提示访问违规。
我的代码是:CAotuSendDoc *mydoc = (CAotuSendDoc *)((CMainFrame*)AfxGetApp()->GetMainWnd())->GetActiveDocument();
那么我换一种方法,在主框架创建时就在Create函数中获取到文档指针并保存在成员变量中,
在线程调用时把主框架指针传进线程,在线程中访问成员变量--文档指针,这时语句执行没有问题,但是
执行到通过这个文档指针访问文档类中的成员变量时又崩溃了CAotuSendDoc *mydoc = m_mainh->mydoct;
int TimeInterval = 10;
if (TimeInterval >= mydoc->RunInterval)//这句崩溃了,访问违规
{
。
}我该怎么改啊??我就想在子线程中读写文档类的一些成员变量。
想在线程中先获取文档指针,再访问一个文档类里的一个变量。
在获取文档指针时程序崩溃,提示访问违规。
我的代码是:CAotuSendDoc *mydoc = (CAotuSendDoc *)((CMainFrame*)AfxGetApp()->GetMainWnd())->GetActiveDocument();
那么我换一种方法,在主框架创建时就在Create函数中获取到文档指针并保存在成员变量中,
在线程调用时把主框架指针传进线程,在线程中访问成员变量--文档指针,这时语句执行没有问题,但是
执行到通过这个文档指针访问文档类中的成员变量时又崩溃了CAotuSendDoc *mydoc = m_mainh->mydoct;
int TimeInterval = 10;
if (TimeInterval >= mydoc->RunInterval)//这句崩溃了,访问违规
{
。
}我该怎么改啊??我就想在子线程中读写文档类的一些成员变量。
如何看这个指针是否有效?在主框架的Create获取后就一直存着,他的值肯定不是NULL。
问题是我还想改变一些成员变量的值,那只能传指针,那穿指针岂不又访问不了了。
在主框架中添加一个自定义消息:
.H
#define WM_GetRunInterval WM_USER + 101
afx_msg LRESULT OnGetRunInterval(WPARAM wParam, LPARAM lParam);
.CPP
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_MESSAGE(WM_GetRunInterval, &CMainFrame::OnGetRunInterval)
END_MESSAGE_MAP()
LRESULT CMainFrame::OnGetRunInterval(WPARAM wParam, LPARAM lParam)
{
CAotuSendDoc *MYDOC = (CAotuSendDoc *)GetActiveDocument();
*(int*)wParam = MYDOC->RunInterval;
return true;
}在线程中调用:
int datt = 0;
事先保存的主框架this指针.SendMessage(WM_GetRunInterval, (WPARAM)&datt);但是这样有个缺点,如果消息函数处理时间太长,界面会卡死啊!
而且消息频率过大会不会丢消息??
请教大神:
1、下面的代码都需要消息获取来的数据,只能用SendMessage啊,用PostMessage他不等待的话下面的代码都没法用了。请问SendMessage互相等待会有什么坏处啊?
2、在本例中,消息执行函数如果耗时很长,那界面都很卡啊,我这种情况只能用消息吗?还有其他方法可以操作文档类的成员变量吗?