⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_14993.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:14993 发表者:爱谁谁 发表日期:2002-09-13 12:56:27
<br>主题:产生了一个工作线程进行计算,但是在工作线程计算的时候“主线程(程序)”不响应我的任何消息,请问为什么(我在工作线程中)?
<br>内容:是这样的:<BR>&nbsp;&nbsp;&nbsp;&nbsp;我用一个对话框作为我的程序的主界面,当我点对话框上的一个按钮时启动一个工作线程进行计算(计算需要很长的时间1小时左右)。我的目的是在我的工作线程计算的时候不要时让我对话框界面(主线程)没有反映(例如:无法拖动对话框,无法最大话、最小话等等)。<BR>一下是我的一段代码:<BR><BR>//辅助线程函数(执行后台运行程序)<BR>UINT BackRunThread(LPVOID pParam)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;PARAMSTRUCT *param;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString strProgID,strCurProgName;<BR>&nbsp;&nbsp;&nbsp;&nbsp;HWND hWnd;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD dw = 1;//0-错误 1-正确<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;param = (PARAMSTRUCT*)pParam;<BR>&nbsp;&nbsp;&nbsp;&nbsp;strProgID = param-&gt;strProgID;<BR>&nbsp;&nbsp;&nbsp;&nbsp;strCurProgName = param-&gt;strCurProgName;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////////////////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;//后台运行代码<BR>&nbsp;&nbsp;&nbsp;&nbsp;CProgDoc&nbsp;&nbsp;&nbsp;&nbsp;m_CurDoc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BOOL m_bBreak,m_bContinue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_bBreak = m_bContinue = FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CProgTempl *pCurPage = NULL;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;InitLog(strCurProgName);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!m_CurDoc.InitDoc(strProgID,SYS_DATABASE))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dw = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dw = 1;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;int nEnd=m_CurDoc.GetPageCount();<BR>&nbsp;&nbsp;&nbsp;&nbsp;for (int i=1;i&lt;=nEnd;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1000);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nPageNo=i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nRet=PageDebugAndRun(SYS_DATABASE,m_CurDoc,pCurPage,nPageNo,1,0,m_bBreak,m_bContinue);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!nRet) dw = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else i=nRet;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (pCurPage) delete pCurPage;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//根据结果确定LPARAM参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////////////////////////////////////////<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hWnd = param-&gt;hWnd;<BR>&nbsp;&nbsp;&nbsp;&nbsp;::SendMessage(hWnd,THREADOVER,(WPARAM)param,(LPARAM)dw);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR><BR>//定时启动一个线程进行后台处理<BR>void CBackRunDlg::OnTimer(UINT nIDEvent) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString strProgID,strProgRunTime,strCurProgName;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BOOL bFind = FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nItemCount,nItem;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LVITEM lvi;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//确定已经到执行时间的程序的ID<BR>&nbsp;&nbsp;&nbsp;&nbsp;nItemCount = ((CListCtrl*)GetDlgItem(IDC_LIST_SELECTED))-&gt;GetItemCount();<BR>&nbsp;&nbsp;&nbsp;&nbsp;for (nItem=0; nItem&lt;nItemCount; nItem++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lvi.mask = LVIS_STATEIMAGEMASK | LVIF_IMAGE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lvi.iItem = nItem;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lvi.iSubItem = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((CListCtrl*)GetDlgItem(IDC_LIST_SELECTED))-&gt;GetItem(&lvi);;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (lvi.iImage == atoi(WAITBACKRUN))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strProgID = ((CListCtrl*)GetDlgItem(IDC_LIST_SELECTED))-&gt;GetItemText(nItem,3);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strCurProgName = ((CListCtrl*)GetDlgItem(IDC_LIST_SELECTED))-&gt;GetItemText(nItem,2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bFind = TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//如果现在没有程序在执行的话,启动一个线程执行程序<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nIDEvent == BACKRUNTIMER && !m_bRunning && bFind)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bRunning = TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_param.hWnd = this-&gt;m_hWnd;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_param.strProgID = strProgID;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_param.strCurProgName = strCurProgName;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_param.nItem = nItem;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetItemState(nItem,BACKRUNNING,strProgID);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CWinThread* pThread = AfxBeginThread(BackRunThread,(LPVOID)&m_param,THREAD_PRIORITY_LOWEST);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnTimer(nIDEvent);<BR>}<BR><BR>现在的问题是:<BR>&nbsp;&nbsp;&nbsp;&nbsp;当我的工作线程开始工作时,我的对话框窗口就没有任何反映了,直到我的工作线程技术。不知道这是为什么!<BR>&nbsp;&nbsp;&nbsp;&nbsp;事实上我用工作线程进行计算的目的就是想使界面在计算时不要死掉,但现在好像无法达到这个目的!<BR><BR><BR>请高手指点迷津!!!!!!!!!!!!!!!!!!!!!!<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:小戟 回复日期:2002-09-13 15:24:52
<br>内容:AfxBeginThread(BackRunThread,(LPVOID)&m_param)试试
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:爱谁谁 回复日期:2002-09-13 15:29:57
<br>内容:试过了,一样的效果!<BR>不过还是要感谢支持!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:小戟 回复日期:2002-09-13 15:36:15
<br>内容:你换到其他函数中,不在OnTimer中试试;我猜测是否由于你的m_param.hWnd = this-&gt;m_hWnd;引起的,改为m_param.hWnd = this。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:爱谁谁 回复日期:2002-09-13 15:39:18
<br>内容:怎么可能呢?<BR>m_param.hWnd 可是HWND类型呀,而this是CWnd*呀!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:小戟 回复日期:2002-09-13 15:52:15
<br>内容:哦,弄错了,还是直接送this吧,
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:lyw 回复日期:2002-09-23 09:29:29
<br>内容:用m_param.hWnd = AfxGetMainWnd()-&gt;GetSafeHwnd();<BR>如果还是不行,你只传递hWnd参数给线程函数试试看,看是不是这个原因,<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lvyaoxin 回复日期:2002-10-11 12:33:37
<br>内容:在线程函数里加上这个试一下<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(GetMessage(&Msg,NULL,0,0))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&Msg);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&Msg);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(Msg.message)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ff 回复日期:2002-10-11 14:17:34
<br>内容:统一楼上的说法,或者在工作线程里增加退出的代码
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -