线程中调用 GetDlgItem函数失误
线程中调用 GetDlgItem函数出错
我通过对话框窗口的一个button的单击事件来创建了一个新线程,在这个线程中调了一个通过GetDlgItem来设置编辑框文本的函数,编译没问题,但调试时发现每次执行到WriteLog函数体中的GetDlgItem函数时就卡住了,也没有任何信息,各位大侠能帮小弟看看到底是什么原因么?
这里面创建了一个线程:
void CT2Dlg::OnBnClickedBtnS()
{
HANDLE handle = (HANDLE)_beginthreadex(NULL, 0, EventProgress, this, 0, &Thread1ID);
WaitForSingleObject(handle, INFINITE);
CloseHandle(handle);
}
线程函数:
UINT CT2Dlg::EventProgress(LPVOID lpParam)
{
.....
CT2Dlg *pT2 = (CT2Dlg*)lpParam;
pT2->WriteLog(...);
}
WriteLog函数原型:
void CT2Dlg::WriteLog(LPCTSTR lpLog)
{
CString strTmp;
GetDlgItem(IDC_EDIT3)->GetWindowText(strTmp);
if (!strTmp.IsEmpty())
{
strTmp += "\r\n";
}
strTmp += lpLog;
GetDlgItem(IDC_EDIT3)->SetWindowText(strTmp);
((CEdit*)GetDlgItem(IDC_EDIT3))->LineScroll(((CEdit*)GetDlgItem(IDC_EDIT3))->GetLineCount() - 1);
}
------解决方案--------------------
你的这个问题是一个普遍问题, HANDLE handle = (HANDLE)_beginthreadex(NULL, 0, EventProgress, this, 0, &Thread1ID);创建的是工作者线程,所以当在线程中调用主窗体中的控件,设置控件属性等资源的时候,一旦牵扯上消息就会报错。用AfxBeginThread创建线程就可以了。侯杰的一本关于线程的书里讲得很明白。在AfxBeginThread创建线程时,内部给你做了很多工作。
我通过对话框窗口的一个button的单击事件来创建了一个新线程,在这个线程中调了一个通过GetDlgItem来设置编辑框文本的函数,编译没问题,但调试时发现每次执行到WriteLog函数体中的GetDlgItem函数时就卡住了,也没有任何信息,各位大侠能帮小弟看看到底是什么原因么?
这里面创建了一个线程:
void CT2Dlg::OnBnClickedBtnS()
{
HANDLE handle = (HANDLE)_beginthreadex(NULL, 0, EventProgress, this, 0, &Thread1ID);
WaitForSingleObject(handle, INFINITE);
CloseHandle(handle);
}
线程函数:
UINT CT2Dlg::EventProgress(LPVOID lpParam)
{
.....
CT2Dlg *pT2 = (CT2Dlg*)lpParam;
pT2->WriteLog(...);
}
WriteLog函数原型:
void CT2Dlg::WriteLog(LPCTSTR lpLog)
{
CString strTmp;
GetDlgItem(IDC_EDIT3)->GetWindowText(strTmp);
if (!strTmp.IsEmpty())
{
strTmp += "\r\n";
}
strTmp += lpLog;
GetDlgItem(IDC_EDIT3)->SetWindowText(strTmp);
((CEdit*)GetDlgItem(IDC_EDIT3))->LineScroll(((CEdit*)GetDlgItem(IDC_EDIT3))->GetLineCount() - 1);
}
GetDlgItem
------解决方案--------------------
你的这个问题是一个普遍问题, HANDLE handle = (HANDLE)_beginthreadex(NULL, 0, EventProgress, this, 0, &Thread1ID);创建的是工作者线程,所以当在线程中调用主窗体中的控件,设置控件属性等资源的时候,一旦牵扯上消息就会报错。用AfxBeginThread创建线程就可以了。侯杰的一本关于线程的书里讲得很明白。在AfxBeginThread创建线程时,内部给你做了很多工作。