Re: this->EndDialog hangs with thread
I changed my code and had a client test it. He still gets a hang on close
and only used the IRC thread.
The only thing I reference inside my thread now is :
CTest1Dlg *dlg=(CTest1Dlg*) AfxGetApp()->GetMainWnd();
Is this bad to do as well?
which I use for getting the Socket Information that I declared in the
header.
send(dlg->clisock,User,User.GetLength(),0); //these send irc connect
information to irc server
send(dlg->clisock,Nick,Nick.GetLength(),0);
send(dlg->clisock,Join,Join.GetLength(),0);
And I do some receives as well.
while(s!=SOCKET_ERROR && dlg->ee!=0)
{
if (ioctlsocket(s, FIONREAD, &arg) != 0) {
inputline = ReceiveLine(dlg->clisock); //ReceiveLine is a custom
function I wrote that gets a line of text from input
}
//switch/case results of inputline
}
All of my output to dialog controls are done through messages:
Inside my CTest1DLG class
Message Map:
ON_MESSAGE(UWM_ADDSTRING, &CTest1Dlg::OnAddChatString)
ON_MESSAGE(UWM_ADDUSER, &CTest1Dlg::OnAddChatUser)
ON_MESSAGE(UWM_DELUSER, &CTest1Dlg::OnDelChatUser)
ON_MESSAGE(UWM_UPDATESTATS, &CTest1Dlg::OnUpdateStats)
LRESULT CTest1Dlg::OnAddChatString(WPARAM, LPARAM lParam)
{
CString * s = (CString *)lParam;
m_chat.AppendText(*s);
delete s;
return 0;
}
LRESULT CTest1Dlg::OnAddChatUser(WPARAM, LPARAM lParam)
{
CString * s = (CString *)lParam;
m_users.AddString(*s);
delete s;
return 0;
}
LRESULT CTest1Dlg::OnDelChatUser(WPARAM, LPARAM lParam)
{
CString * s = (CString *)lParam;
int nIndex = 0;
nIndex=m_users.FindStringExact(nIndex, *s);
m_users.DeleteString(nIndex);
delete s;
return 0;
}
LRESULT CTest1Dlg::OnUpdateStats(WPARAM, LPARAM lParam)
{
//too much code to list
return 0;
}
void AddChatText(CString & name)
{
CString * s = new CString(name);
HWND hWnd=AfxGetApp()->m_pMainWnd->m_hWnd;
::PostMessage(hWnd,UWM_ADDSTRING, 0, (LPARAM)s);
}
void AddChatUser(CString & name)
{
CString * s = new CString(name);
HWND hWnd=AfxGetApp()->m_pMainWnd->m_hWnd;
::PostMessage(hWnd,UWM_ADDUSER, 0, (LPARAM)s);
}
void DelChatUser(CString & name)
{
CString * s = new CString(name);
HWND hWnd=AfxGetApp()->m_pMainWnd->m_hWnd;
::PostMessage(hWnd,UWM_DELUSER, 0, (LPARAM)s);
}
void UpdateStats(CString & name)
{
CString * s = new CString(name);
HWND hWnd=AfxGetApp()->m_pMainWnd->m_hWnd;
::PostMessage(hWnd,UWM_UPDATESTATS, 0, (LPARAM)s);
}
my header file for CTest1DLG: (sniplet)
protected:
afx_msg LRESULT OnAddChatString(WPARAM, LPARAM);
afx_msg LRESULT OnAddChatUser(WPARAM, LPARAM lParam);
afx_msg LRESULT OnDelChatUser(WPARAM, LPARAM lParam);
afx_msg LRESULT OnUpdateStats(WPARAM, LPARAM lParam);
.....
friend void AddChatText(CString & name);
friend void DelChatUser(CString & name);
friend void AddChatUser(CString & name);
friend void UpdateStats(CString & name);
"Scott McPhillips [MVP]" <org-dot-mvps-at-scottmcp> wrote in message
news:%23TMj%23zf6HHA.5844@TK2MSFTNGP02.phx.gbl...
"Scott Kraemer" <skraemer8@cox.net> wrote in message
news:uD9hLkf6HHA.4436@TK2MSFTNGP03.phx.gbl...
Okay I sorta have the same problem as Alex posted above. I just wanted
some insight as to see if I am doing this right or wrong. For some
clients it works and some it hangs while closing the main dialog.
My Main dialog starts creates a global socket so I can use it in other
threads declared in main dlg header ( SOCKET clisock; sockaddr_in cli;)
I then start my IRC thread in the InitDialog
ircThread = AfxBeginThread(ircthread, 0);
my ircthread function updates dialog boxes on my main dialog by setting
something as this:
CTest1Dlg *dlg=(CTest1Dlg*) AfxGetApp()->GetMainWnd();
dlg->m_chat.AppendText(chatmsg);
That is a clear violation of MFC rules. Do not access the GUI from a
secondary thread.
Have you tried your code in a debug build? MFC normally will assert when
you violate this fundamental MFC rule. For the proper workaround see FAQ
11 & 12 here: http://vcfaq.mvps.org/mfc/index.htm