月度归档: 2015 年 1 月

  • WIN32 主线程中不能使用 WaitForSingleObject

    主线程中不能使用 WaitForSingleObject(m_GameProcessInfo.hProcess, INFINITE);

    这样会造成莫名奇妙的问题,比如我在一个项目这样用了,结果客户反馈说程序会造成鼠标一在转圈圈。经远程远程客户机排查,结果就是在主线程中使用WaitForSingleObject(m_GameProcessInfo.hProcess, INFINITE); 导致了主线程消息循环阻塞而引发的。

    经过在网上查找,很快找到了解决方案,用下面的代码取代WaitForSingleObject.

    while (TRUE)
    {
        DWORD result;
        MSG msg;
    
        result = MsgWaitForMultipleObjects(1, &m_GameProcessInfo.hProcess,
                   FALSE, INFINITE, QS_ALLINPUT);
    
        if (result == ( WAIT_OBJECT_0))
        {
            break;
        }
        else
        {
            PeekMessage(&msg, NULL , 0, 0, PM_REMOVE );
            DispatchMessage(&msg);
        }
    }

    微软对此函数的解释是:

    为了解决在主线程中Wait的问题,微软专门设计了一个函数MsgWaitForMultipleObjects,这个函数即可以等待信号(thread,event,mutex等等),也可以等待消息(MSG)。即不论有信号被激发或者有消息到来,此函数都可以返回。

    这样改过后,再发给客户测试,现象消失,问题解决。

  • WIN32获取当前程序所在目录

    WIN32获取当前程序所在目录

    #include <Shlwapi.h>
    #pragma comment (lib , "shlwapi.lib" )
    
    TCHAR wszModulePath[MAX_PATH ];
    ::memset(wszModulePath, 0, sizeof(TCHAR)*MAX_PATH);
    GetModuleFileName(NULL , wszModulePath, MAX_PATH);
    PathAppend(wszModulePath, _T ("..\\" ));
    wcscat_s(wszModulePath, GAME_CLIENT_PATH);

  • C#中,让线程挂起

    C#中,让线程挂起。不能使用Thead.Suspend(), 这个函数在.NET中已经被否决了,具体原因没有深入研究。微软推荐使用System.Threading中的函数,比如Monitor, Mutex, Event等。

    在QQ好友空间访客提取的项目中我使用了ManualResetEvent这个Event类,具体用法如下:

    类字段定义:

    private ManualResetEvent _event = new ManualResetEvent (true ); //线程事件
    private bool _pause = false; //线程是否暂停

    工作线程函数中:

    if (_pause)
    {
         SetStatus( "已暂停");
    }
    _event.WaitOne();

    暂停函数中:

    SetStatus("暂停中...");
    _event.Reset();
    _pause = true;

    恢复函数中:

    if (_pause)
    {
         //to resume thread
         _event.Set();
         _pause = false;
    
         return;
    }

  • IIS服务器遭遇用户上传图片后,显示无权访问的问题

    IIS服务器遭遇用户上传图片后,显示无权访问的问题,错误信息如下:

    HTTP 错误 401.3 – Unauthorized
    由于 Web 服务器上此资源的访问控制列表(ACL)配置或加密设置,您无权查看此目录或页面

    解决办法:

    1、打开站点的身份验证

    2、在匿名身份验证上点右键菜单,然后点编辑 

    3、把匿名用户标识改为“应用程序池标识“

    最后点击确定并重启站点后OK(没有测试不重启站点的情况下是不是也可以生效)

  • jquery-ui-timepicker-addon.js 只显示日期格式(不带时间)

    jquery-ui-timepicker-addon.js 只显示日期格式(不带时间)

    jquery-ui-timepicker-addon.js 只显示日期格式(不带时间):

    $('#query_time').datepicker({dateFormat: 'yy-mm-dd'});

    带时间选择:

    $('#query_time').datetimepicker({dateFormat: 'yy-mm-dd'});

  • IIS运行PHP,设置出错时显示PHP错误,而不是报500

    1、点击对应的网站,进入“错误页”

    2、点击“编辑功能设置”

    3、把错误响应改为“详细错误”

  • MYSQL查询当天的数据  

    MYSQL查询当天的数据  

    SELECT * FROM  have_update_site WHERE DATE(update_time )=CURDATE()