关于网友提出的“ 多线程中如何先停止这个线程在开始这个线程”问题疑问,本网通过在网上对“ 多线程中如何先停止这个线程在开始这个线程”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 多线程中如何先停止这个线程在开始这个线程
描述:本帖最后由 yann2 于 2010-10-02 04:03:54 编辑
我是用来AfxBeginThread创建,大家可能没理解这个标题的意思
我贴段代码
补充一下,不能定义多个指针或者HANDLE来记录他们。。具体原因不能详细的和大家叙述了,反正要求是这样的。。
单击按钮:
m_nStop = 0;
m_dwType = 1;
AfxBeginThread(WorkThreadProc,NULL);
线程:
UINT WorkThreadProc(LPVOID lParam)
{
int i = 0;
switch(pDlg->m_dwType)
{
case -1:
return 0;
case 1:
for(i = 0; ;i++)
{
if(pDlg->m_nStop == 1 || pDlg->m_nStop == 99)// 99 1?±??ùóD??3ì
{
return 0;
}
pDlg->OutputDataToView(IDC_START1,i);
Sleep(10);
}
break;
}
return 0;
}
在外部我停止这个线程的方法有2种
m_nStop = 1 或者 m_nStop = 99
现在目的是单击按钮的时候先停止这个线程在开始这个线程
我试过定义一个CWinThread的指针
CWinThread = AfxBeginThread(..);
终止用TerminateThread来强行关闭,可以是可以,但是有内存泄漏
根据我的了解是最好让线程自己return 这样是不会有内存泄漏的情况发生的
强行关闭后因为他自己没有return 所以产生了内存泄漏
我很矛盾啊。。。
这个该如何解决呢 ?
期待高手现身说法~~~~~
解决方案1: 楼主请这样试试:
定义一个CWinThread *m_pCWinThread,初始化为NULL
单击按钮:
C/C++ code
while(m_pCWinThread)
{
m_nStop = 1;
Sleep(1)
}
m_nStop = 0;
m_dwType = 1;
AfxBeginThread(WorkThreadProc,NULL);
线程:
C/C++ code
UINT WorkThreadProc(LPVOID lParam)
{
int i = 0;
switch(pDlg->m_dwType)
{
case -1:
return 0;
case 1:
for(i = 0; ;i++)
{
if(pDlg->m_nStop == 1 || pDlg->m_nStop == 99)// 99 1?±??ùóD??3ì
{
pDlg->m_pCWinThread = NULL; // 增加这一句
return 0;
}
pDlg->OutputDataToView(IDC_START1,i);
Sleep(10);
}
break;
}
return 0;
}
解决方案2:
UINT WorkThreadProc(LPVOID lParam)
{
int i = 0;
do{ //外面加一层循环
switch(pDlg->m_dwType)
{
case -1:
return 0;
//m_dwType增加一个类型0
case 0:
do{
if (pDlg->dwType != 0)
break;
Sleep(10);
}while(1);
case 1:
for(i = 0; pDlg->m_dwType == 1;i++) //注意,这里循环条件变了
{
if(pDlg->m_nStop == 1 || pDlg->m_nStop == 99)// 99 1?±??ùóD??3ì
{
return 0;
}
pDlg->OutputDataToView(IDC_START1,i);
Sleep(10);
}
break;
}
}while(1);
return 0;
}
然后按钮的代码里,想让线程不工作就让m_dwType=0;否则就让m_dwType = 1;想让线程真正退出,就让m_dwType = -1;即可
解决方案3: 反正就两种方式,楼主自己选一种吧
1 : 这是最简单的方式,也就是让线程函数执行完成,此时线程正常结束.它会返回一个值,一般0是成功结束, 当然你可以定义自己的认为合适的值来代表线程成功执行.在线程内调用AfxEndThread将会直接结束线程,此时线 程的一切资源都会被回收.
2 : 如果你想让另一个线程B来结束线程A,那么,你就需要在这两个线程中传递信息. 不管是工作者线程还是界面线程,如果你想在线程结束后得到它的结果,那么你可以调用: ::GetExitCodeThread函数
解决方案4: 置退出标志
Sleep 足够时间
AfxBeginThread
但最好还是保留线程句柄, 程序退出时也应该做处理的
以上介绍了“ 多线程中如何先停止这个线程在开始这个线程”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3321566.html