none
如果在BHO中创建稳定的循环线程 RRS feed

  • 常规讨论

  • 运行在IE8下。


    线程代码
    DWORD WINAPI LoopCheckThreadFun(LPVOID Param)
    {

            while(g_IsStill_Loop)
            {
                    int i = 0;
                    for (i = 0; i < 100; i++)
                    {
                            Sleep(10);
                    }
           return 0;
    }

    case DLL_PROCESS_ATTACH:
      g_Check_Thread_Hand = ::CreateThread(NULL, NULL, LoopCheckThreadFun, NULL, NULL, &ThreadId);

    //退出线程
       g_IsStill_Loop = false;
      if (CheckThreadStatus(g_Check_Thread_Hand))
      {
            WaitForSingleObject(g_Check_Thread_Hand, 100 *1000);
      }

    在IE8中点击网页的时候都假死。
    个人推测是是 WaitForSingleObject造成的。
    但是又没有好的解决方法, 不想使用定时器给主线程造成负担。
    请问大家有什么好的建议没?

    2011年7月28日 3:26

全部回复

  • DWORD WINAPI LoopCheckThreadFun(LPVOID Param)
    {
        BOOL bExit = FALSE;
        while(!bExit)
        {
            int i = 0;
            for (i = 0; i < 100; i++)
            {
                if(!g_IsStill_Loop)
                {
                   bExit = TRUE;
                   break;
                }
                Sleep(10);
            }
        }
        return 0;
    }
    
    


    您的线程函数可能结构上设计的不是很合理。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年7月28日 5:04
    版主
  • 其实这个不是关键

    说了最关键的是WaitForSingleObject函数造成的,IE8在一个浏览器页面有很多个Tab,  很多TAB是单独一个进程,所以使用WaitForSingleObject会造成主界面卡住一会。

    你那样的我早试过, 效果是一样的。

         while(g_IsStill_Loop)
        {
            int i = 0;
            for (i = 0; i < 100; i++)
            {
                if (!g_IsStill_Loop)
                    break;
                Sleep(10);
            }

         return 0;

       }

    2011年7月28日 5:35
  • 声明g_IsStill_Loop 的时候有加violate吗
    2011年7月29日 4:04
  • 加了的...
    2011年7月29日 7:14
  • WaitForSingleObject卡住是因为线程不退出。

    线程不退出是因为你线程函数写的有问题。

    就像1楼说的那样

    2011年8月1日 6:46

  • dWaitForSingleObject卡住是因为线程不退出。

    线程不退出是因为你线程函数写的有问题。

    就像1楼说的那样

    不懂就别来乱说好不, 线程代码早都给你贴出来了, 你自己说哪里有问题?

    说了会WaitForSingleObject会稍微卡住一下就会导致IE8整个卡住,不是线程不会退出, 只是和IE8的兼容有问题。

    本身在主线程就不该使用 WaitForSingleObject

     

    2011年8月11日 8:00