您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 多线程中如何先停止这个线程在开始这个线程

多线程中如何先停止这个线程在开始这个线程

来源:网络整理     时间:2016/8/16 7:35:27     关键词:

关于网友提出的“ 多线程中如何先停止这个线程在开始这个线程”问题疑问,本网通过在网上对“ 多线程中如何先停止这个线程在开始这个线程”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 多线程中如何先停止这个线程在开始这个线程
描述:

本帖最后由 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:

引用楼主 yann2 的回复:
现在目的是单击按钮的时候先停止这个线程在开始这个线程


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

相关图片

相关文章