CCriticalSection是不行的,因为是同一线程,它不起作用

解决方案 »

  1.   

    你是说象
    void ff()
    {
            static lock=1;
            if(lock==1)
            {
          lock=2;
                //执行工作
                lock=1;
            }
            else
                 return;
    }
    这种设计吗?
    还是用CSemaphore类?
    前一种明显不行,后一种某线程连续发两次LOCK,其计数值减1还是减2?
      

  2.   

    void CShopServerDlg::NavigateComplete2Explorer1(LPDISPATCH pDisp, VARIANT* URL)
    {
    // TODO: Add your message handler code here
    static CSemaphore tt;
    if(tt.Lock(0))
    {         //执行工作
    tt.Unlock();
    }
    }
    这样也不行
      

  3.   

    如果是在同一个线程内,最简单的就是定义一个bool型的静态变量,在函数的头部检查bool变量,如果为true,说明已经被调用了,否则说明没有被调用,进入把bool型变量设成true.
    由于在一个线程中前后多次调用一个函数只有一种可能---是递归调用。所以可以将递归调用替换成循环,便于控制。上面用静态变量的方法只能适用于如果已有调用,后续调用被扔掉也没有关系的逻辑,如果希望后续的调用能够排队,并且继续得到依序调用,可能可以像消息队列一样建立一张包含函数参数结构的链表,然后设置一个event对象,来手工设置,(这种方法不知在单线程中可行否?),如果不考虑效率,在同一个线程中肯定可以用不断的查询当前静态变量的方法来完成函数的排队调用。
      

  4.   

    就是递归调用。
    虽然我的程序没有直接设计递归调用,但是我放置测试语句时发现的确存在重入问题。
    我猜想Windows的消息机制有可能在同一线程中造成递归调用
      

  5.   

    你在消息处理函数里调用SendMessage发送同一消息,是可能重入