@xihu1364 不成啊 CFileDialog 我已经给了一个成员变量 但是还是不成啊  求大神指导~!!

解决方案 »

  1.   

    我的CFileDialog窗口 在选择文件就没反映了  这是什么意思?说的明白点!
      

  2.   

    就是我在选择文件的时候,主对话框的线程响应了计时器,然后主界面自动刷新,这时我选择文件的CFileDialog窗口就失去响应 选择文件后不会有反应
      

  3.   

    不是不启动定时器可以选择,启动定时器 定时器没到时间的时候也没有问题,每当定时器相应后,CFileDialog窗口在选择文件就没有相应了 是不是线程冲突的问题 纠结 求大牛告之~
      

  4.   

    没有 只是查询sqlite 显示更新的数据,应该不会而且有时候刷新一次不会产生CFileDialog无响应 ,但是两三次肯定会使CFileDialog无响应
      

  5.   

    大牛  你看下我操作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();
      

  6.   

    如何打开sqlite失败哪?肯定阻塞。。
      

  7.   

    没有 只是查询sqlite 显示更新的数据,应该不会而且有时候刷新一次不会产生CFileDialog无响应 ,但是两三次肯定会使CFileDialog无响应
    我猜 你启动定时器更新数据,主线程应该卡死了在选择文件对话框时,肯定无响应喽。。
    如果是这样 把更新数据的那块放到线程里面做,不影响界面的操作性
      

  8.   

    既然是定时刷新的 那么在SQLITE_BUSY时直接返回好了 反正有机会刷新或者是把这部分放在后台线程去处理
      

  9.   


    谢谢 谢谢各位 的确是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 是不安全的。