mfc对话框程序 主线程有一个定时器,当定时器刷新后 CFileDialog窗口 无响应 @xihu1364 不成啊 CFileDialog 我已经给了一个成员变量 但是还是不成啊 求大神指导~!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的CFileDialog窗口 在选择文件就没反映了 这是什么意思?说的明白点! 就是我在选择文件的时候,主对话框的线程响应了计时器,然后主界面自动刷新,这时我选择文件的CFileDialog窗口就失去响应 选择文件后不会有反应 不是不启动定时器可以选择,启动定时器 定时器没到时间的时候也没有问题,每当定时器相应后,CFileDialog窗口在选择文件就没有相应了 是不是线程冲突的问题 纠结 求大牛告之~ 没有 只是查询sqlite 显示更新的数据,应该不会而且有时候刷新一次不会产生CFileDialog无响应 ,但是两三次肯定会使CFileDialog无响应 大牛 你看下我操作sqlite的代码是否会产生阻塞sqlite3* db; char **dbResult; int result; char *errmsg=NULL; //GetReadLock(sqliteRWLock); result = sqlite3_open("D:\\database\\MBIS_DTMB_CenterServer.db",&db); //连接数据库 if(result!=SQLITE_OK) { MessageBox(L"连接数据库失败"); sqlite3_close(db); //ReleaseRWLock(sqliteRWLock); ::CoUninitialize(); } const char *str="SELECT * FROM MBIS_DTMB_Status"; int nRow,nColumn; int AllCode=100; do { result = sqlite3_get_table(db,str,&dbResult,&nRow,&nColumn,&errmsg);//查询数据,并将数据存放在dbResult if(result==SQLITE_BUSY) { Sleep(100); AllCode--; if(AllCode==0) { MessageBox(L"操作数据库失败",L"说明",MB_OK); sqlite3_close(db); //ReleaseRWLock(sqliteRWLock); sqlite3_free(errmsg); ::CoUninitialize(); return ; } } } while (result==SQLITE_BUSY); CListCtrl* pmyListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1); LONG lStyle; lStyle = GetWindowLong(C_listlog.m_hWnd, GWL_STYLE);//获取当前窗口style lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置style SetWindowLong(C_listlog.m_hWnd, GWL_STYLE, lStyle);//设置style DWORD dwStyle = C_listlog.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl) CString str2; //显示数据库中的内容 for(int h=1;h<=nRow;h++) { for(int l=0;l<nColumn;l++) { str2=UTF8ToUnicode(dbResult[h*nColumn+l]); if(l==0) { C_listlog.InsertItem(h-1,str2); } else { C_listlog.SetItemText(h-1,l,str2); } } } sqlite3_free_table(dbResult); sqlite3_close(db); //ReleaseRWLock(sqliteRWLock); ::CoUninitialize(); 如何打开sqlite失败哪?肯定阻塞。。 没有 只是查询sqlite 显示更新的数据,应该不会而且有时候刷新一次不会产生CFileDialog无响应 ,但是两三次肯定会使CFileDialog无响应我猜 你启动定时器更新数据,主线程应该卡死了在选择文件对话框时,肯定无响应喽。。如果是这样 把更新数据的那块放到线程里面做,不影响界面的操作性 既然是定时刷新的 那么在SQLITE_BUSY时直接返回好了 反正有机会刷新或者是把这部分放在后台线程去处理 谢谢 谢谢各位 的确是sqlite 引起的阻塞;CoUninitialize()这个函数引起的,其它没有问题 ,顺便把百度百科这个函数的说明贴上吧,防止再有人因为这个产生问题。CoUninitialize关闭当前线程的COM库,卸载线程加载的所有dll,释放任何其他的资源,关闭在线程上维护所有的RPC连接。void CoUninitialize();备注:一个线程必须调用 CoUninitialize 一次在每次成功调用CoInitialize或CoInitializeEx。只有CoUninitialize对应于CoInitialize调用对应CoInitialize或CoInitializeEx调用他们初始化库能关闭它。调用OleInitialize必须通过调用OleUninitialize平衡。OleUninitialize 函数调用的OleUninitialize内部,所以应用程序调用OleUninitialize不也需要调用CoUninitialize。CoUninitialize应该在应用程序关闭后调用,作为最后一次调用COM库在应用程序主窗户隐藏,消息循环结束之后。如果有剩余的对话开着,CoUninitialize开始了模态消息循环和派发任何挂起的消息在容器或服务器里对于这个COM应用程序。通过派发信息,CoUninitialize 在确保应用程序等待所有它的消息接收之前不退出。Non-COM信息被丢弃。因为没有办法控制顺序进程内服务器加载或卸载, 从DllMain函数中调用CoInitialize, CoInitializeEx,或者 CoUninitialize 是不安全的。 jpg格式的相片 关于鼠标单击消息的处理问题 请教获取像素点颜色值GetPixel(hdc,x,y)? FreeSeagull(孤海闲鸥),感谢你发给我的plug-in例子。 printf()函数怎么实现的? 怎样关闭IE窗口,不是通过获取进程关闭它???详情如下:: 急急!MFC中ActiveX项目中插入一个内置控件为什么不显示 我也想要代码 急此书 哪们老手教我在DOS下用VC的CL。EXE编译程序好吗? MFC如何修改编辑框文字垂直方向上的显示位置 有一份C的代码想转成Delphi
sqlite3* db;
char **dbResult;
int result;
char *errmsg=NULL;
//GetReadLock(sqliteRWLock);
result = sqlite3_open("D:\\database\\MBIS_DTMB_CenterServer.db",&db); //连接数据库
if(result!=SQLITE_OK)
{
MessageBox(L"连接数据库失败");
sqlite3_close(db);
//ReleaseRWLock(sqliteRWLock);
::CoUninitialize();
}
const char *str="SELECT * FROM MBIS_DTMB_Status";
int nRow,nColumn;
int AllCode=100;
do
{
result = sqlite3_get_table(db,str,&dbResult,&nRow,&nColumn,&errmsg);//查询数据,并将数据存放在dbResult
if(result==SQLITE_BUSY)
{
Sleep(100);
AllCode--;
if(AllCode==0)
{
MessageBox(L"操作数据库失败",L"说明",MB_OK);
sqlite3_close(db);
//ReleaseRWLock(sqliteRWLock);
sqlite3_free(errmsg);
::CoUninitialize();
return ;
}
}
} while (result==SQLITE_BUSY);
CListCtrl* pmyListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);
LONG lStyle;
lStyle = GetWindowLong(C_listlog.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(C_listlog.m_hWnd, GWL_STYLE, lStyle);//设置style
DWORD dwStyle = C_listlog.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
CString str2; //显示数据库中的内容
for(int h=1;h<=nRow;h++)
{
for(int l=0;l<nColumn;l++)
{
str2=UTF8ToUnicode(dbResult[h*nColumn+l]);
if(l==0)
{
C_listlog.InsertItem(h-1,str2);
}
else
{
C_listlog.SetItemText(h-1,l,str2);
}
}
}
sqlite3_free_table(dbResult);
sqlite3_close(db);
//ReleaseRWLock(sqliteRWLock);
::CoUninitialize();
我猜 你启动定时器更新数据,主线程应该卡死了在选择文件对话框时,肯定无响应喽。。
如果是这样 把更新数据的那块放到线程里面做,不影响界面的操作性
谢谢 谢谢各位 的确是sqlite 引起的阻塞;
CoUninitialize()这个函数引起的,其它没有问题 ,顺便把百度百科这个函数的说明贴上吧,防止再有人因为这个产生问题。
CoUninitialize关闭当前线程的COM库,卸载线程加载的所有dll,释放任何其他的资源,关闭在线程上维护所有的RPC连接。void CoUninitialize();备注:一个线程必须调用 CoUninitialize 一次在每次成功调用CoInitialize或CoInitializeEx。只有CoUninitialize对应于CoInitialize调用对应CoInitialize或CoInitializeEx调用他们初始化库能关闭它。调用OleInitialize必须通过调用OleUninitialize平衡。OleUninitialize 函数调用的OleUninitialize内部,所以应用程序调用OleUninitialize不也需要调用CoUninitialize。CoUninitialize应该在应用程序关闭后调用,作为最后一次调用COM库在应用程序主窗户隐藏,消息循环结束之后。如果有剩余的对话开着,CoUninitialize开始了模态消息循环和派发任何挂起的消息在容器或服务器里对于这个COM应用程序。通过派发信息,CoUninitialize 在确保应用程序等待所有它的消息接收之前不退出。Non-COM信息被丢弃。因为没有办法控制顺序进程内服务器加载或卸载, 从DllMain函数中调用CoInitialize, CoInitializeEx,或者 CoUninitialize 是不安全的。