1、我做矢量图形程序。
2、我用多线程画图,每个线程画一个种类图形。例如thread1画Line;thread2画Circle.
3、我建立一个struct做线程的参数,在结构体中记录了图形的类别。
4、我在界面线程中用了阻塞,分别给结构体离的图形列别赋值,主要是为了避免各个线程读取结构体的时候不发生冲突。如:
m_tdParam.drwStyle = LINESTYLE;
if ( m_PDrawThread )
{
m_PDrawThread->ResumeThread();
::WaitForSingleObject(m_PDrawThread->m_hThread,INFINITE);
delete m_PDrawThread;
// m_PDrawThread = false;
}
m_PDrawThread = AfxBeginThread( DrawFunction, (void*)&m_tdParam );
m_PDrawThread->m_bAutoDelete = FALSE;
m_PDrawThread->ResumeThread();
//阻塞线程。
::WaitForSingleObject( g_eventStart, INFINITE );
m_tdParam.drwStyle = CIRCLESTYLE;
if ( m_PDrawThread1 )
{
m_PDrawThread1->ResumeThread();
::WaitForSingleObject(m_PDrawThread1->m_hThread,INFINITE);
delete m_PDrawThread1;
// m_PDrawThread1 = false;
}
m_PDrawThread1 = AfxBeginThread( DrawFunction, (void*)&m_tdParam );
m_PDrawThread1->m_bAutoDelete = FALSE;
m_PDrawThread1->ResumeThread();
::WaitForSingleObject( g_eventStart, INFINITE );

m_tdParam.drwStyle = TEXTSTYLE;
if ( m_PDrawThread2 )
{
m_PDrawThread2->ResumeThread();
::WaitForSingleObject(m_PDrawThread1->m_hThread,INFINITE);
delete m_PDrawThread2;
// m_PDrawThread2 = false;
}
m_PDrawThread2 = AfxBeginThread( DrawFunction, (void*)&m_tdParam );
m_PDrawThread2->m_bAutoDelete = FALSE;
m_PDrawThread2->ResumeThread();
::WaitForSingleObject( g_eventStart, INFINITE );5、问题是现在当连续快速按滚动条按钮的时候就会出现【非法操作内存】的信息。
请各个大侠帮忙看看。我觉得应该是线程通信没有弄好。

解决方案 »

  1.   

    把这两句
    delete m_PDrawThread;
    // m_PDrawThread = false;
    改成
     CloseHandle(m_PDrawThread);
    另外,如果g_eventStart是个手动复位事件话,必需在
    ::WaitForSingleObject( g_eventStart, INFINITE );
    之后加上
    SetEvent(g_eventStart,FALSE);
      

  2.   

    最后一句说错了,是
    ResetEvent(g_eventStart);
    不好意思,
    另外你这段程序用不用线程一个样,因为你一起画图线徎,调用线程就无穷地Wait....
    与单线程没任何区别。
      

  3.   

    我放弃了原来的想法,现在把画图单独一个线程。这样简单多了。谢谢 lzzqqq(Jonersen) 。