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(没有测试不重启站点的情况下是不是也可以生效)