线程同步到主进程? 现在我有个工作线程,里面对一个对象的属性进行符值,然后通知主进程更新数据,可是由于线程工作更新快所以主进程处理时这个属性的值已经更新了好几次了?这种情况怎么做一下同步啊??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要更新时工作线程用SendMessage给主线程发消息 "可是由于线程工作更新快所以主进程处理时这个属性的值已经更新了好几次了?"1、如果主线程只是读的话,收到更新通知的时候,不需要同步,直接读属性就可以了,那不就是当前值。2、更新很快,人眼不知道能不能跟的上,所以,滞后那么一点点,不知道能不能接受3、UI可以设置定时器,以可以接受的频率,刷新属性值,不需要工作线程通知,这占不了多少CPU 一般采集器,都是可以设置采集数据量的大小,如a 进程采集100m数据,需要10分钟,在10分钟内b进程完全可以取走上次数据.如果实时性要求很强,用电子硬件实现。 void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection); 使用 Critical Section 对象是最简便的方法 使用方法: 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); 既然是线程同步的问题,我认为这个问题使用 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;} 请教:在子窗口使用DC内存显示BMP位图显示不出来的问题 以前用过的东西,忘了…… 郑州市民喝散装白酒中毒死亡 CString一个字符串中间插入一个加车符显示乱码 可以改net中的字体吗? 各位计算机专业的学生学的课程是什么?回帖课程都有分拿。 关于AnimateWindow()在CDialog中的使用! 这个错误是怎么回事?(编译是发生的) vc如何获得windows默认打印机的驱动程序名 如何根据文件类型取得图标? 已知文件名取文件所在目录 wizardbar在什么地方啊
2、更新很快,人眼不知道能不能跟的上,所以,滞后那么一点点,不知道能不能接受
3、UI可以设置定时器,以可以接受的频率,刷新属性值,不需要工作线程通知,这占不了多少CPU
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
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);
事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象。在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;
}