做数据库的查询和显示,用到多线程。(对话框点击按钮查询,然后列表显示)
1、先定义线程函数
unsigned int __stdcall CDlg::QueryThreadFunc1( LPVOID lParam )
{
CDlg *pThis = reinterpret_cast<CDlg*>( lParam );
pThis->DoOracleQuery();
return 0;
}
这个在头文件中是静态函数:
static unsigned int __stdcall QueryThreadFunc1(LPVOID lParam);
上述代码中,
DoOracleQuery()是普通函数,里面是数据查询处理。
2、创建线程
m_hQueryThread是成员变量,HANDLE类型
void CDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
if(!InitDB())
{
return;
}
m_hQueryThread = reinterpret_cast<HANDLE>(::_beginthreadex(NULL, 0, QueryThreadFunc1, reinterpret_cast<void*>(this), CREATE_SUSPENDED, 0));
if (m_hQueryThread != NULL)
{
::ResumeThread(m_hQueryThread);
}
}
上面这个是一次性线程,在启动线程后,可以直接
CloseHandle(m_hQueryThread);
m_hQueryThread = INVALID_HANDLE_VALUE;
有时候,我们需要在线程中做while循环操作。
如:
void DoParseRecv()
{
while(m_bRunning)
{
Sleep(5);
}
}
这时,在创建线程前,将m_bRunning置为TRUE。
退出程序时(或其他任何时候),关闭线程
m_bRunning = false;
if (m_hThd != INVALID_HANDLE_VALUE)
{
WaitForSingleObject(m_hThd, INFINITE);
CloseHandle(m_hThd);
m_hThd = INVALID_HANDLE_VALUE;
}