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();
}
}
明天继续看看正式的线程控制方式,比较一下优劣。
采用昨天方案一中的线程函数内部正常退出。通过线程函数入参进行消息通讯。
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();
}
}
明天继续看看正式的线程控制方式,比较一下优劣。
相关文章推荐
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
- 090904项目进展:强制终止线程
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
- Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源 synchronized
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
- Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案
- Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案
- linux下的多进程通信(IPC)原理及实现方案(管道、队列、信号量、共享内存)
- 共享内存----实现进程间通信
- POSIX 线程详解 一种支持内存共享的简捷工具
- 利用共享内存实现进程间通信
- linux进程内存共享---实现生产者消费者问题
- ThreadLocal父子线程传递实现方案
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- spark学习七 共享内存的实现(快速的共享数据)
- 共享内存的实现
- windows实机 与 Vmware的linux虚机 实现samba等共享目录方案
- 共享内存多进程间通信,进程间同步使用信号量来实现
- 将Win32 C/C++应用程序迁移到Linux-进程、线程和共享内存