读书人

关于多线程擦除和重画图 新手请问

发布时间: 2013-06-25 23:45:42 作者: rapoo

关于多线程擦除和重画图 新手请教
DWORD WINAPI Wander(LPVOID j)
{
int *route ;
float k ; //两点直线斜率
float c1,c2,c3 ;
float x, y, x1, y1;
float Middle ;
route = (int*)j;

for (int i=0; i<n; i++)
{
x = pt[route[i]].x ;
y = pt[route[i]].y ;
x1= pt[route[i+1]].x;
y1= pt[route[i+1]].y;

Middle = sqrt ((x-x1)*(x-x1)+(y-y1)*(y-y1)) ;
while (Middle>=10)
{
Sleep (200) ;

k = (y1-y)/(1.0*(x1-x)) ;
c1= 1+k*k ;
c2= -2*k*k*x1-2*x+2*k*(y1-y) ;
c3= x*x+(y1-y)*(y1-y)-2*k*(y1-y)*x1-400+k*k*x1*x1 ;

if (x1>x)
x = (-c2+sqrt (c2*c2-4*c1*c3))/(2*c1) ;

if (x1<x)
x = (-c2-sqrt (c2*c2-4*c1*c3))/(2*c1) ;
y = k*(x-x1)+y1 ;

//Sleep (500) ;
EnterCriticalSection(&cs);//加锁
SetROP2(cd, R2_NOT);
SelectObject(cd, GetStockObject(NULL_BRUSH));
Ellipse (cd, x, y, x+10, y+10) ;
LeaveCriticalSection(&cs);//解锁

Sleep (500) ;

EnterCriticalSection(&cs);//加锁
SetROP2(cd, R2_NOT);
SelectObject(cd, GetStockObject(NULL_BRUSH));
Ellipse (cd, x, y, x+10, y+10) ;
LeaveCriticalSection(&cs);//加锁

Middle = sqrt ((x-x1)*(x-x1)+(y-y1)*(y-y1)) ;

}

}

return 0 ;

}

void CAntView::On32772() //迭代开始
{
// TODO: 在此添加命令处理程序代码
HANDLE* threads = new HANDLE[n] ;
DWORD* idThreads = new DWORD[n] ;
hWnd = AfxGetMainWnd()->m_hWnd;
InitializeCriticalSection(&cs);//初始化结构CRITICAL_SECTION
cd = ::GetDC(hWnd) ;
DrawPoint() ;
for (int i=0; i<Max; i++)
{
//迭代一次,计算完一个完整路径
for (int j=0; j<work.AntNumb; j++)
{
//_beginthread(Wander, 0, (void *)work.route[j]) ;
threads[j] = CreateThread (NULL, 0, Wander, work.route[j], CREATE_SUSPENDED, &idThreads[j]) ;
}

for (int k = 0; k < work.AntNumb; k++) // 由于生成的是CREATE_SUSPENDED的线程,所以这里开始让线程开始运行
ResumeThread(threads[k]);

WaitForMultipleObjects(work.AntNumb, threads, TRUE, INFINITE); // 等待线程运行结束
//Sleep (3000) ;
}

::ReleaseDC (hWnd,cd) ;
}
以上的代码是模拟两个蚂蚁在三个点之间的路径上的移动,当路径不同的时候程序的运行是正常的,但是当两只蚂蚁走相同的路径的时候,刚画上的圆没有等待时间就马上被擦除了,知道原因是SetROP2;当路径相同的时候第一个线程画一个圆进入sleep,第二个线程因为要画的坐标和前一个线程画的位置相同,所以本来应该画圆的变成了擦除圆。现在有两个问题:1.有什么办法让第一个线程画的圆不被第二个线程擦除,第二个线程正常画圆呢?2.为什么注释掉WaitForMultipleObjects,线程中的Ellipse 执行没法画出圆呢?
谢谢各位大虾!!关于多线程擦除和重画图 新手请问 多线程 迭代
------解决方案--------------------


画图最好交给主线程吧。我是这样做的,线程只改变影响图的参数,所有的画图都在主线程的OnPaint()函数进行。

读书人网 >VC/MFC

热点推荐