多线程中使用SqLite3的问题。
代码如下,运行时出错,请高手指教……
typedef struct _THREADDATA_PRESQLITE//用于传递参数给预览数据的线程
{
CWnd * pDlg;
CWnd * pListCtrl;
CppSQLite3Query * query;
CString tableName;
}*LPTHREADDATA_PRESQLITE,THREADDATA_PRESQLITE;
//读取文件的线程
DWORD WINAPI ThreadProc_PreSqlite(LPVOID lParam)
{
LPTHREADDATA_PRESQLITE pData = (LPTHREADDATA_PRESQLITE)lParam;
CDataConversionDlg * pDlg=(CDataConversionDlg*)pData->pDlg;
CListCtrl * pListCtrl=(CListCtrl*)pData->pListCtrl;
SkinH_LockUpdate(pData->pListCtrl->GetSafeHwnd(),TRUE);
// 改变CList控件的样式
ListView_SetExtendedListViewStyleEx(pListCtrl->m_hWnd,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
pListCtrl->SetFont(&pDlg->m_Font2);
int nFields = pData->query->numFields(); //取得数据库表的列数
int nCol = 0;
int nRow = 0;
CString szText;
for(nCol = 0; nCol < nFields; nCol++)
{
pListCtrl->InsertColumn(nCol, CString(pData->query->fieldName(nCol)), LVCFMT_LEFT, 80);
}
while (!pData->query->eof())
{
pListCtrl->InsertItem(nRow, CString(pData->query->fieldValue(0)));//stmt->ValueString(0)));
for(nCol = 1; nCol < nFields; nCol++)
{
pListCtrl->SetItemText(nRow, nCol, CString(pData->query->fieldValue(nCol)));//stmt->ValueString(nCol)));
}
++nRow;
pData->query->nextRow();
}
pData->query->finalize();
//解锁更新
SkinH_LockUpdate(pListCtrl->GetSafeHwnd(),FALSE);
TC_ITEM item;
item.mask = TCIF_TEXT;
item.pszText = (LPSTR)(LPCSTR)pData->tableName;
pDlg->m_tabCtrl.InsertItem(pDlg->m_tabCtrl.GetItemCount(), &item, pListCtrl);
return 0;
}
void CDataConversionDlg::AddSheetDB(CppSQLite3DB &db,CString &tableName)
{
CString szExec(_T(""));
szExec.Format(_T("SELECT * FROM %s"),tableName);
CppSQLite3Query query = db.execQuery(szExec);
//当数据不为空的时候读取数据并填充入LISTCTRL
if (!query.eof())
{
CListCtrl* pListCtrl = new CListCtrl;
if (!pListCtrl->Create(WS_CHILD|WS_BORDER|LVS_REPORT, CRect(0, 0, 0, 0), &m_tabCtrl, IDC_SHEET))
{
MessageBox(_T("创建表格失败!"),_T("提示"),MB_OK );
return;
}
HANDLE hThreads;
DWORD dwThreadId; //存放线程ID
LPTHREADDATA_PRESQLITE param = new THREADDATA_PRESQLITE;
param->pDlg=this;
param->pListCtrl=pListCtrl;
param->query=&query;
param->tableName=tableName;
hThreads = CreateThread( NULL,0,ThreadProc_PreSqlite, (LPVOID)param,0,&dwThreadId);
CloseHandle(hThreads);
}
}
跟踪时发现好像是线程内的CppSQLite3Query 出错,也许还有其它……