我想防止函数重入,应怎么办? CCriticalSection是不行的,因为是同一线程,它不起作用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是说象void ff(){ static lock=1; if(lock==1) { lock=2; //执行工作 lock=1; } else return;}这种设计吗?还是用CSemaphore类?前一种明显不行,后一种某线程连续发两次LOCK,其计数值减1还是减2? void CShopServerDlg::NavigateComplete2Explorer1(LPDISPATCH pDisp, VARIANT* URL){ // TODO: Add your message handler code here static CSemaphore tt; if(tt.Lock(0)) { //执行工作 tt.Unlock(); }}这样也不行 如果是在同一个线程内,最简单的就是定义一个bool型的静态变量,在函数的头部检查bool变量,如果为true,说明已经被调用了,否则说明没有被调用,进入把bool型变量设成true.由于在一个线程中前后多次调用一个函数只有一种可能---是递归调用。所以可以将递归调用替换成循环,便于控制。上面用静态变量的方法只能适用于如果已有调用,后续调用被扔掉也没有关系的逻辑,如果希望后续的调用能够排队,并且继续得到依序调用,可能可以像消息队列一样建立一张包含函数参数结构的链表,然后设置一个event对象,来手工设置,(这种方法不知在单线程中可行否?),如果不考虑效率,在同一个线程中肯定可以用不断的查询当前静态变量的方法来完成函数的排队调用。 就是递归调用。虽然我的程序没有直接设计递归调用,但是我放置测试语句时发现的确存在重入问题。我猜想Windows的消息机制有可能在同一线程中造成递归调用 你在消息处理函数里调用SendMessage发送同一消息,是可能重入 创建MFC项目时有两个资源文件,添加不了控件变量 想Debug进去 用CreateProcess创建的进程, 请教有什么办法吗? 献上所有分.请教一个元旦出游的问题. 有没有做过divx解码的呀? 【公告】关于论坛强制结帖【醒目】 ado的连接问题 请教高手 小弟刚学完VC但感觉还是什么都不能干,望高手建议下一步该干什么?学些什么方向。 如何动态改变鼠标? CHtmlView的问题 如何让一个窗口激活? 请问CRegKey这个类怎么用?
void ff()
{
static lock=1;
if(lock==1)
{
lock=2;
//执行工作
lock=1;
}
else
return;
}
这种设计吗?
还是用CSemaphore类?
前一种明显不行,后一种某线程连续发两次LOCK,其计数值减1还是减2?
{
// TODO: Add your message handler code here
static CSemaphore tt;
if(tt.Lock(0))
{ //执行工作
tt.Unlock();
}
}
这样也不行
由于在一个线程中前后多次调用一个函数只有一种可能---是递归调用。所以可以将递归调用替换成循环,便于控制。上面用静态变量的方法只能适用于如果已有调用,后续调用被扔掉也没有关系的逻辑,如果希望后续的调用能够排队,并且继续得到依序调用,可能可以像消息队列一样建立一张包含函数参数结构的链表,然后设置一个event对象,来手工设置,(这种方法不知在单线程中可行否?),如果不考虑效率,在同一个线程中肯定可以用不断的查询当前静态变量的方法来完成函数的排队调用。
虽然我的程序没有直接设计递归调用,但是我放置测试语句时发现的确存在重入问题。
我猜想Windows的消息机制有可能在同一线程中造成递归调用