090905项目进展:终止线程的实现方案一:共享“状态变量”内存

一、使用最简单的全局变量方法停止线程

采用昨天方案一中的线程函数内部正常退出。通过线程函数入参进行消息通讯。

1,  加入状态在线程函数入参:

使用指针传入,指针所指的内存,线程内外都可以读写,也相当于是一种很粗俗的共享内存方法了。

 

BOOL *pbSearching;   // 控制线程状态

struct tCheckStatus{

       CListCtrl *pm_listSite;

       CStatic    *pm_wndMessage;

       CIPAddressCtrl *pm_addrTo;

       CIPAddressCtrl *pm_addrFrom;

    CTreeCtrl       *pm_smbTree;

    CEdit       *pm_Edit;

       BOOL m_IsSaveToDb;

       CString *pm_passwd;

       CString *pm_username;

    CButton *pm_btnSearch;

    int serverType;

    int m_port;

    BYTE bLevel;

    BOOL *pbSearching;   // 控制线程状态

};

 

2,线程启动前

tListSmb.pbSearching = &bSearching;

        pTrdConnect = AfxBeginThread(ThreadFuncListSmbRecource, &tListSmb);

3 线程函数调用时,每当一个新IP都先检查共享内存的状态,如果线程外已经停止,退出循环,返回函数,线程正常退出。

UINT ThreadFuncListSmbRecource(LPVOID lpParam)

{

    tCheckStatus* pInfo=(tCheckStatus*)lpParam;

 

       BYTE field0,field1,field2,field3;

       BYTE field4,field5,field6,field7;

 

       pInfo->pm_addrFrom->GetAddress(field0,field1,field2,field3);

       pInfo->pm_addrTo->GetAddress(field4,field5,field6,field7);

   

 

       CString strIPAddr;

 

    pInfo->pm_smbTree->DeleteAllItems();

 

       for(int i =field3; i <= field7; i++)

    {

        // 通过全局变量控制线程状态,“停止”按下后bSrc值为FALSE,循环终止,线程函数退出

        if (!*(pInfo->pbSearching))

        {

            break;

        }

              strIPAddr.Format("%d.%d.%d.%d",field0,field1,field2,i);

        pInfo->pm_Edit->SetWindowText(strIPAddr);

 

              if(CheckHostStatus(strIPAddr))

        {

            ListOnlineRecourse(pInfo->pm_smbTree, strIPAddr, pInfo->bLevel);

              }

       }

 

    // 查找完成后恢复按钮文本、Searching状态和Edit文本

    pInfo->pm_Edit->SetWindowText("Finished!");

    pInfo->pm_btnSearch->SetWindowText("Search");

    *(pInfo->pbSearching) = FALSE;

 

    return 0;

}

 

4 按钮停止时,只修改bSearching状态即可,也就是只修改共享内存状态,其他不用理会,线程自身检查状态退出,避免premature的退出方式。

void CDlgSmbList::OnButtonSearch()

{

       // TODO: Add your control notification handler code here

    if (bSearching)

    {

        bSearching = FALSE;

        m_btnSearch.SetWindowText("Search");

    }

    else

    {

        bSearching = TRUE;

        m_btnSearch.SetWindowText("STOP");

        // 开始查找

           UpdateData(TRUE);

 

           tListSmb.pm_addrFrom = &m_addrFrom;

           tListSmb.pm_addrTo = &m_addrTo;

        tListSmb.pm_smbTree = &m_smbTree;

        tListSmb.pm_Edit = &m_editCurIp;

        tListSmb.bLevel = m_bLevel;

        tListSmb.pm_btnSearch = &m_btnSearch;

        tListSmb.pbSearching = &bSearching;

 

        pTrdConnect = AfxBeginThread(ThreadFuncListSmbRecource, &tListSmb);

 

        UpdateWindow();

        m_smbTree.UpdateWindow();

    }

}

 

明天继续看看正式的线程控制方式,比较一下优劣。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值