Thank you for you suggestion.I think if I use any sync mechanism such as
event. It may be locked the resource if I did not unlock in time which would
child thread.
,including WM_DESTROY message by check button of close. And then ,if I resume
the child thred ,all OK.
"Joseph M. Newcomer" wrote:
See below...
On Wed, 16 Aug 2006 18:20:01 -0700, weihong <ying@docomolabs-beijing.com.cn> wrote:
My program environment is .net2005.The partial code is shown as below:
void CfinalView::OnRButtonDblClk(UINT nFlags, CPoint point)
{
CRect rc;
GetClientRect(&rc);
if(point.x>rc.left&&point.x<(rc.right/2)&&point.y>rc.top&&point.y<rc.bottom)
{
//AfxBeginThread(RUNTIME_CLASS(CDetailPlot));
}
if(point.x>(rc.right/2)&&point.x<rc.right&&point.y>rc.top&&point.y<(rc.bottom/2))
{
//AfxMessageBox(_T("haha"));
AfxBeginThread(RUNTIME_CLASS(CDetailPlot));
}
CView::OnRButtonDblClk(nFlags, point);
}
22222222222222222222222222222222222222
BOOL CDetailPlot::InitInstance()
{
pCFrameWnd=new CMyFrameWnd();
pCFrameWnd->Create(NULL,_T("???"));
HWND hWnd=pCFrameWnd->GetSafeHwnd();
pCFrameWnd->ShowWindow(SW_SHOW);
ChidThread=AfxBeginThread(PlotConstell,(LPVOID)pCFrameWnd);
pCFrameWnd->ChildThread=ChidThread;
//Listen((LPVOID)pFrameWnd);
return TRUE;
}
----------------------------------------------------------------------------
void CMyFrameWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
DCount++;
if(DCount%2!=0)
{
SuspendThread(ChildThread->m_hThread);
}
else
{
ResumeThread(ChildThread->m_hThread);
}
*****
Do not ever use SuspendThread for anything. This will only get you into trouble. Use
some synchronization primitive to control the thread. There are lots of ways to do this,
but SuspendThread is not a permissible implementation. Example: if the SuspendThread
happens when the thread is doing a 'new', no other thread will ever be able to allocate
anything.
*****
CFrameWnd::OnLButtonUp(nFlags, point);
}
---------------------------------------------------------------------------
class CMyFrameWnd : public CFrameWnd
{
DECLARE_DYNCREATE(CMyFrameWnd)
public:
CMyFrameWnd(); // ????????????????
virtual ~CMyFrameWnd();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
CWinThread *ChildThread;
public:
int DCount;
};
What I want to do is create a user-interface thread when double check the
left button of mouse in mainframe.And then in the new window I want to create
another worker thread to plot.When it plotting , I could suspend/resume the
plot thread by check left button.
The problem is when the child-window responsed the mouse's
action(suspend plot thread) , it may suspend the thread of mainframe
stochastic, and another check will resume both of then.
Please tell me why it happened and how to deal with.Thank you.
*****
Use an event for this. See my essay on threading on my MVP Tips site. Do a ResetEvent to
pause the thread, SetEvent to resume it.
Why would the child window suspend the main thread? This sounds like a programming error
to me. Are you sure it is actually suspending the main thread?
But there is no reason to do anything about this code until you replace the
SuspendThread/ResumeThread sequence with something that will work.
****
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm