在基于对话框的程序中,我有另一个线程,用于重复调用主对话框中的函数。在创建线程之后,一切正常,直到第一次调用主对话框的函数(thisclass->GetData();
),程序流突然返回到构造函数。我不知道为什么,因为这里没有new
声明。
UINT __cdecl RunCPRead(LPVOID pParam)
{
CMyDlg *thisclass = (CMyDlg *)pParam;
while (thisclass->m_Start)
{
thisclass->GetData(); // jumps to constructor on first call
}
return 0;
}
// default contructor, back here after first `thisclass->GetData();` call
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CMyDlg::OnBnClickedStart()
{
Init();
AfxBeginThread(&RunCPRead, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
}
CMyDlg::GetData()
{
char buff[8];
int result = getDataBuffer(buff); // call function in dll
// do something with the data
}
我认为不允许从不同的线程访问对象方法,因此我将GetData()
及其相关的函数/变量更改为全局的,然后出现另一个问题。这些变量在程序启动时初始化但在创建新线程后,当从新线程访问并使我的程序行为变得奇怪时,它们的值变为“随机”
我的计划有什么问题,如何解决?