多线程中使用SqLite3的问题。

lcy_888 2011-11-21 10:59:45
代码如下,运行时出错,请高手指教……

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 出错,也许还有其它……
...全文
511 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiuzhoulh 2011-11-21
  • 打赏
  • 举报
回复
还有楼主的AddSheetDB(CppSQLite3DB &db,CString &tableName)中为啥要传地址进去执行啊?
看代码不应该这样传啊
jiuzhoulh 2011-11-21
  • 打赏
  • 举报
回复
SQLite支持多线程访问
oyljerry 2011-11-21
  • 打赏
  • 举报
回复
如果怕有问题,多个线程做好同步互斥,每次只有一个线程访问Sqlite数据库
龙行天下之Sky 2011-11-21
  • 打赏
  • 举报
回复
最好把访问SQLite的函数写成线程安全的
加上临界区或者其他内核对象控制线程同步
lcy_888 2011-11-21
  • 打赏
  • 举报
回复
多谢楼上各位讲解,请楼上的帮我改一下,谢了。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧