MFC中多线程的退出处理

来源:互联网 发布:mac中文游戏 编辑:程序博客网 时间:2024/04/29 17:08

在MFC中经常会遇到多个线程之间内存共享的问题,这些共享内存在分配时无甚难处,但在什么地方释放掉内存比较好呢?

下面是按下一个按钮后启动线程的代码:

OnButton()

{

      sharedMem = allocate()

       AfxBeginThread(Thread1,...)

       AfxBeginThread(Thread2,...)     

}

 

首先想到的是启动子线程后,就在OnButton消息响应函数等待,可在Thread1和Thread2里面设置一个标志位,当这两个线程退出后,更改相应的标志位,在OnButton里面等待两个标志位都改变后,释放内存即可,具体的应该如下所示:

 

OnButton()

{

      sharedMem = allocate()

       AfxBeginThread(Thread1,...)

       AfxBeginThread(Thread2,...)     

       while(!(bFlagThread1Exit && bFlagThread2Exit))

      {

               Sleep(2);

      }

     release shared memory

}

 

UINT Thread1(...)

{

     bFlagThread1Exit  = false;

      ... //线程处理代码

     bFlagThread1Exit  = true;

}

 

 

UINT Thread2(...)

{

     bFlagThread2Exit  = false;

      ... //线程处理代码

     bFlagThread2Exit  = true;

}

看起来很完美,按完键后等待两个线程结束,但实际上 release shared memory并不会执行到,由于MFC的机制问题,程序会一直阻塞在while(!(bFlagThread1Exit && bFlagThread2Exit))循环里,反映到界面就是感觉程序界面如死机一般。

 

 

我这里给出的解决方法是,在程序线程结束后,发送消息给程序,在消息响应函数中,当查看到所有的线程都推出后,再进行释放共享资源,例如内存的操作,这里给出的方法是统计退出线程个数的方法,具体如下:

UINT Thread1(...)

{

      ... //线程处理代码

     SendMessage(MY_THREAD_EXIT,...);

}

 

UINT Thread2(...)

{

      ... //线程处理代码

     SendMessage(MY_THREAD_EXIT,...);

}

 

在OnButton里面,置线程退出统计变量为0;

OnButton()

{

      cnt = 0;

      sharedMem = allocate()

       AfxBeginThread(Thread1,...)

       AfxBeginThread(Thread2,...)     

}

 

在MY_THREAD_EXIT的消息响应函数里面,当两个线程发送的退出消息都收到再进行释放内存的工作。

OnThreadExit()

{

      cnt++;

      if(cnt == 2)

     {

           release shared memory;

     }

}

 

当然,除了例子中所举的线程计数的方法外,也可以采用其它的方法,这里就不再赘述了。

 

原创粉丝点击