📄 subject_45501.htm
字号:
<p>
序号:45501 发表者:tata 发表日期:2003-07-01 09:52:02
<br>主题:急急急!利用线程编制程序
<br>内容:请问高手,我这里需要用线程来遍采集卡采集图形的程序,在OnPaint()函数当中直接处理采集程序还好用,当利用线程时,就出现一堆错误,下面是我利用线程遍的程序,请大侠指教,谢谢啊。<BR>void CTrack3View::OnPaint() <BR>{<BR> AfxBeginThread(Process,&(this->m_hWnd),THREAD_PRIORITY_NORMAL,0);<BR>}<BR>UINT CTrack3View::Process(LPVOID pctl)<BR>{<BR> CTrack3Doc *p=(CTrack3Doc*)pctl;<BR> MdigControl(p->MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS);<BR> MdigGrab(p->MilDigitizer, p->MilImage);<BR> MbufCopy(p->MilImage,p->MilImageDisp);<BR> return(0);<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>
<font color=red>答案被接受</font><br>回复者:zbf 回复日期:2003-07-01 14:02:25
<br>内容:线程参数不对,<BR>UINT CTrack3View::Process(LPVOID pctl)<BR>{<BR> HWND p=(HWND)pctl;<BR> MdigControl(p->MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS);<BR> MdigGrab(p->MilDigitizer, p->MilImage);<BR> MbufCopy(p->MilImage,p->MilImageDisp);<BR> return(0);<BR>}<BR>或下面改动<BR>void CTrack3View::OnPaint() <BR>{<BR> AfxBeginThread(Process,&(GetDocument()),THREAD_PRIORITY_NORMAL,0);<BR>}<BR><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>
回复者:tata 回复日期:2003-07-01 18:31:19
<br>内容:谢谢zbf,真的很好用啊 ,对象都是在文档类定义的,我用的是你给我的第二种方法修改的,程序立刻可以连续的采集图象了。万分感谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tata 回复日期:2003-07-01 19:08:43
<br>内容:呵呵,我又遇到一个问题,这时我在线程当中调用视图类的成员变量,程序却不认<BR>我在CTrack3view.h当中定义 BYTE *object;int aim;之后,给aim 附值,接着在<BR>执行文件当中,<BR>UINT void CTrack3View::OnPaint() <BR>{<BR> AfxBeginThread(Process,GetDocument()),THREAD_PRIORITY_NORMAL,0);<BR>}<BR>UINT CTrack3View::Process(LPVOID pctl)<BR>{<BR> CTrack3Doc *p=(CTrack3Doc*)pctl;<BR> MdigControl(p->MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS);<BR> MdigGrab(p->MilDigitizer, p->MilImage);<BR> MbufGet(p->MilImage,p->image);<BR> object=aim+p->image;<BR> MbufPut(p->MilImage,p->image);<BR> MbufCopy(p->MilImage,p->MilImageDisp);<BR> return(0);<BR>}<BR>这时出现如下错误:不任已经定义好的成员变量aim 和object<BR>F:\wmj\track\track5 多线程\Track3View.cpp(140) : error C2597: illegal reference to data member 'CTrack3View::aim' in a static member function<BR>F:\wmj\track\track5 多线程\Track3View.cpp(140) : error C2597: illegal reference to data member 'CTrack3View::object' in a static member function<BR><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>
回复者:zbf 回复日期:2003-07-02 09:22:30
<br>内容:类的静态成员函数不能直接访问类的成员变量,你可以把object和aim定义为全局变量,或间接访问类的成员变量,方法如下:<BR>UINT CTrack3View::Process(LPVOID pctl)<BR>{<BR> CTrack3View *pView;<BR> CTrack3Doc *p=(CTrack3Doc*)pctl;<BR> POSITION posView ;<BR> posView=p->GetFirstViewPosition();<BR> pView=p->GetNextView(posView);<BR> //现在可以引用object or aim;<BR> pView->object=pView->aim+p->image;<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>
回复者:tata 回复日期:2003-07-02 16:41:41
<br>内容:感谢zbf,我把object 和aim 改成全局变量之后,程序立刻挑通了,心情别提有多舒畅了,真是不知道怎么感觉老兄才好,<BR><BR>只是有个问题只知其然不知所以然,为什么创建线程时,要把线程的指针定义成GetDocument(),而不能直接用(CWnd*)this ?<BR> AfxBeginThread(Process,(GetDocument()),THREAD_PRIORITY_NORMAL,0);<BR><BR>还有,我要在这个线程函数当中调用CPaintDC 函数,以观看图象的处理速度,但在线程中调用函数CPaintDC时,出现"应用程序异常错误unknown software exception (0x80000003),位置为0x77f9f9df",<BR> <BR>UINT CTrack3View::Process(LPVOID pctl)<BR>{<BR> CPaintDC dc((CWnd*)pctl);<BR> CTrack3Doc *p=(CTrack3Doc*)pctl;<BR> MdigControl(p->MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS);<BR> MdigGrab(p->MilDigitizer, p->MilImage);<BR> MbufGet(p->MilImage,p->image);<BR> MbufPut(p->MilImage,p->image);<BR> MbufCopy(p->MilImage,p->MilImageDisp);<BR> return(0);<BR>}<BR>请指教<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>
回复者:zbf 回复日期:2003-07-03 08:59:48
<br>内容:你在CTrack3View类中启动线程,参数用this,实际参数是CTrack3View自己,而不CTrack3Doc <BR>对象指针,CPaintDC 也是这个错误。<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>
回复者:tata 回复日期:2003-07-03 10:30:16
<br>内容:哦,原来是这个样子啊,意思就是说要在线程中调用文挡类的成员,必须在创建线程时,把GetDocument附给Process线程,是这个意思吧?<BR>我这样做之后,调用文挡类的成员果然成功了,可是CPaintDC仍用那个参数却出现错误,<BR><BR>AfxBeginThread(Process,(GetDocument()),THREAD_PRIORITY_NORMAL,0);<BR><BR>UINT CTrack3View::Process(LPVOID pctl)<BR>{<BR><BR> CTrack3Doc *p=(CTrack3Doc*)pctl; //调用成功<BR> CPaintDC dc((CWnd*)pctl); //调用失败<BR> return(0);<BR>}<BR>怎么采用让CTrack3Doc 和 CPaintDC 在线程中同时起作用呢?<BR><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 + -