您的位置:首页 > 其它

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

2009-09-05 23:23 260 查看
一、使用最简单的全局变量方法停止线程
采用昨天方案一中的线程函数内部正常退出。通过线程函数入参进行消息通讯。
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();
}
}

明天继续看看正式的线程控制方式,比较一下优劣。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: