现在我有个工作线程,里面对一个对象的属性进行符值,然后通知主进程更新数据,可是由于线程工作更新快所以主进程处理时这个属性的值已经更新了好几次了?这种情况怎么做一下同步啊???

解决方案 »

  1.   

    要更新时工作线程用SendMessage给主线程发消息
      

  2.   

    "可是由于线程工作更新快所以主进程处理时这个属性的值已经更新了好几次了?"1、如果主线程只是读的话,收到更新通知的时候,不需要同步,直接读属性就可以了,那不就是当前值。
    2、更新很快,人眼不知道能不能跟的上,所以,滞后那么一点点,不知道能不能接受
    3、UI可以设置定时器,以可以接受的频率,刷新属性值,不需要工作线程通知,这占不了多少CPU
      

  3.   

    一般采集器,都是可以设置采集数据量的大小,如a 进程采集100m数据,需要10分钟,在10分钟内b进程完全可以取走上次数据.如果实时性要求很强,用电子硬件实现。
      

  4.   

    void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
    void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
    void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
    void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
      

  5.   

    使用 Critical Section 对象是最简便的方法
      

  6.   

    使用方法:
        1、定义一个 LPCRITICAL_SECTION 全局变量
             LPCRITICAL_SECTION    g_CriticalSection;
        2、使用 g_CriticalSection 前要初始化
             InitializeCriticalSection (&g_CriticalSection);
        3、在要同步的函数入口使用 g_CriticalSection;
             EnterCriticalSection (&g_CriticalSection);
        4、在要同步的函数出口释放 g_CriticalSection;
             LeaveCriticalSection (&g_CriticalSection);
        5、程序结束前删除 g_CriticalSection;
             DeleteCriticalSection (&g_CriticalSection);
      

  7.   

    既然是线程同步的问题,我认为这个问题使用 CEvent 类 是很好方法。
    事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象。在MFC中,CEvent 类对象有两种类型:人工事件和自动事件。(默认为自动事件)
    BOOL CEvent::SetEvent();将 CEvent 类对象的状态设置为有信号状态。
    BOOL CEvent::ResetEvent();该函数将事件的状态设置为无信号状态,并保持该状态直至SetEvent()被调用时为止。
    由于自动事件是由系统自动重置,故自动事件不需要调用该函数。如果该函数执行成功,返回非零值,否则返回零。我们一般通过调用WaitForSingleObject函数来监视事件状态。
    如:UINT WriteW(LPVOID pParam)
    {
     CEdit *pEdit=(CEdit*)pParam;
     pEdit->SetWindowText("");
     for(int i=0;i<10;i++)
     {
         g_Array[i]=''W'';
         pEdit->SetWindowText(g_Array);
      Sleep(1000);
     }
     eventWriteD.SetEvent();
     return 0;
    }
    UINT WriteD(LPVOID pParam)
    {
     CEdit *pEdit=(CEdit*)pParam;
     pEdit->SetWindowText("");
     WaitForSingleObject(eventWriteD.m_hObject,INFINITE);
     for(int i=0;i<10;i++)
     {
      g_Array[i]=''D'';
         pEdit->SetWindowText(g_Array);
      Sleep(1000);
     }
     return 0;
    }