在DAO多線程處理中,有許多局限性,所以我設計了這麼一個類,通過GUI線程來使用DAO的強制調用。在類中使用了GUI的消息隊列,所有進入到CMultiDAORecordset的調用都被迫使用AfxGetThread()來檢查當前的線程。GUI線程指針是放在InitInstance的首端,如果在GUI線程中,引入的調用請求不在運行,那麼CMultiDAORecordSet就會發送一個WM_MULTIDAOMESSAGE消息給AfxGetMainWnd()(在Mainfrm.cpp中)。Mainfrm接受到這個消息,線程也就要再運行一次,這個時候,消息已經接受了,基類CDaoRecordset也就得到了調用。所以你的類是從CMultiDAORecordset繼承的,而不是CDaoRecordset,如下:
class CMySet : public CMultiDaoRecordSet
在相應的CPP文件中也應該改一下:
IMPLEMENT_DYNAMIC(CMySet, CMultiDaoRecordSet)
CMySet::CMySet (CDaoDatabase* pdb) : CMultiDaoRecordSet(pdb)
為了處理接受到的WM_MULTIDAOMESSAGE消息,下面的代碼還應該加在MainFrm中:
在MainFrm.h文件中加:
#ifdef MAINFRAME_CPP
UINT WM_MULTIDAOMESSAGE = RegisterWindowMessage("WM_MULTIDAOMESSAGE");
#else
extern UINT WM_MULTIDAOMESSAGE;
#endif
afx_msg LONG OnMultiDaoMessage( UINT uParam, LONG lParam);
在MainFrm.cpp文件中加:
#define MAINFRAME_CPP
#include "MutliDaoRecordset.h"
//added to the message map
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_REGISTERED_MESSAGE(WM_MULTIDAOMESSAGE, OnMultiDaoMessage)
END_MESSAGE_MAP()
//this function added
LONG CMainFrame::OnMultiDaoMessage( UINT uParam, LONG lParam)
{
//jtm
//based on switch, perform operation...
CMultiDaoRecordSet *pSet = (CMultiDaoRecordSet *)lParam;
LONG lRet = 0;
CString cRet = "";
COleVariant cVar;