mfc对话框程序 主线程有一个定时器,当定时器刷新后 CFileDialog窗口 无响应

码农009 2013-12-12 05:39:31
请教大神
我做了个mfc对话框程序,主线程有个settimer()计时器,当我domal一个窗口后想要选择文件 又用了CFileDialog .domal 来选择文件 当我主线程的 计时器响应后 ,我的CFileDialog窗口 在选择文件就没反映了,求教 如何解决 是什么问题
...全文
242 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
码农009 2013-12-13
引用 5 楼 zgl7903 的回复:
不启动定时器看看正常吗? 好像没有直接关系吧
不是不启动定时器可以选择,启动定时器 定时器没到时间的时候也没有问题,每当定时器相应后,CFileDialog窗口在选择文件就没有相应了 是不是线程冲突的问题 纠结 求大牛告之~
回复
zgl7903 2013-12-13
不启动定时器看看正常吗? 好像没有直接关系吧
回复
码农009 2013-12-13
就是我在选择文件的时候,主对话框的线程响应了计时器,然后主界面自动刷新,这时我选择文件的CFileDialog窗口就失去响应 选择文件后不会有反应
回复
_船长_ 2013-12-13
我的CFileDialog窗口 在选择文件就没反映了 这是什么意思?说的明白点!
回复
码农009 2013-12-13
@xihu1364 不成啊 CFileDialog 我已经给了一个成员变量 但是还是不成啊 求大神指导~!!
回复
码农009 2013-12-13
引用 7 楼 zgl7903 的回复:
定时中做了什么? 是不是有什么阻塞操作
谢谢 谢谢各位 的确是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 是不安全的。
回复
zgl7903 2013-12-13
既然是定时刷新的 那么在SQLITE_BUSY时直接返回好了 反正有机会刷新 或者是把这部分放在后台线程去处理
回复
华美乐章 2013-12-13
引用 8 楼 u010714532 的回复:
[quote=引用 7 楼 zgl7903 的回复:] 定时中做了什么? 是不是有什么阻塞操作
没有 只是查询sqlite 显示更新的数据,应该不会而且有时候刷新一次不会产生CFileDialog无响应 ,但是两三次肯定会使CFileDialog无响应[/quote] 我猜 你启动定时器更新数据,主线程应该卡死了。。。在选择文件对话框时,肯定无响应喽。。 如果是这样 把更新数据的那块放到线程里面做,不影响界面的操作性
回复
shen_wei 2013-12-13
如何打开sqlite失败哪?肯定阻塞。。
回复
码农009 2013-12-13
引用 7 楼 zgl7903 的回复:
定时中做了什么? 是不是有什么阻塞操作
大牛 你看下我操作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();
回复
码农009 2013-12-13
引用 7 楼 zgl7903 的回复:
定时中做了什么? 是不是有什么阻塞操作
没有 只是查询sqlite 显示更新的数据,应该不会而且有时候刷新一次不会产生CFileDialog无响应 ,但是两三次肯定会使CFileDialog无响应
回复
zgl7903 2013-12-13
定时中做了什么? 是不是有什么阻塞操作
回复
版主大哥 2013-12-12
把CFileDialog弄成成员变量
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2013-12-12 05:39
社区公告

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