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、问题是现在当连续快速按滚动条按钮的时候就会出现【非法操作内存】的信息。
请各个大侠帮忙看看。我觉得应该是线程通信没有弄好。
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、问题是现在当连续快速按滚动条按钮的时候就会出现【非法操作内存】的信息。
请各个大侠帮忙看看。我觉得应该是线程通信没有弄好。
delete m_PDrawThread;
// m_PDrawThread = false;
改成
CloseHandle(m_PDrawThread);
另外,如果g_eventStart是个手动复位事件话,必需在
::WaitForSingleObject( g_eventStart, INFINITE );
之后加上
SetEvent(g_eventStart,FALSE);
ResetEvent(g_eventStart);
不好意思,
另外你这段程序用不用线程一个样,因为你一起画图线徎,调用线程就无穷地Wait....
与单线程没任何区别。