我有这样一个系统:后台有一个线程从串口中读取每个点的数据,分析完成后在主界面上显示,同时主界面上针对每一个点都采用动态生成控件的方式,我在主窗口中定义了一个过程(A)用于修改数据,主要由线程调用,同时主界面有刷新功能(B),一旦刷新将把所有的动态控件重新生成,此时不允许调用A。
我使用的是
CreateMutex--一次性WaitForSingleObject--——P
ReleaseMutex-------VCloseHandle--一次性
等方法实现互斥
但现在好像我每次调用B方法刷新时发现A方法也在运行,为什么呢?

解决方案 »

  1.   

    定义一个FUsing,在进入每一个方法时
    while Fusing do ;
    FUsing := true;
    ......
    Fusing := False;
      

  2.   

    你们的方法我都用过,但效果不是很理想
    while Fusing do ;
    FUsing := true;
    ......
    Fusing := False;和互斥量不是一样的吗?
      

  3.   

    各位老大:我是使用互斥量的呀
    CreateMutex--一次性WaitForSingleObject--——P
    ReleaseMutex-------VCloseHandle--一次性
    关键是现在好像没有起作用
    我是在A和B的开始均调用P,结束时调用V的。
      

  4.   

    如果阻塞不行,互斥不行,信号量也不行,
    来个偏方吧:
    利用操作系统的消息队列排队处理,
    要执行A或B之前,都发个相同ID的Message,假设lParam = 1 为A,假设lParam = 2 为B,
    在回调函数里处理A或B。
    发消息好象只能用POSTMESSAGE才能到消息队列中!
      

  5.   

    为什么不能设置一个全局变量实现互斥 呢,
    比如
    var
      bflag:boolean;A:
    while bflag=false do  //如果在执行B则等待
    begin
      sleep(1);
      application.processmessage;
    end;
    bflag:=true;...
    B:
    while bflag do //如果在执行A则等待
    begin
      sleep(1);
      application.processmessage;
    end;
    bflag:=false;
    ...
      

  6.   

    用临界区:
    var cs:TRTLCriticalSection;
    ...
    InitializeCriticalSection(cs);
    ...
    EnterCriticalSection(cs);//进入临界区
    -语句
    LeaveCriticalSection(cs);//临界区结束
    ...
    DeleteCriticalSection(cs);