数据采集线程同步问题(100分)

  • 主题发起人 主题发起人 wben
  • 开始时间 开始时间
W

wben

Unregistered / Unconfirmed
GUEST, unregistred user!
通过A/D板(不带缓存)进行数据采集,采样频率为1、2、5K时进行连续采样,并动态实时图形显示。我采用两个线程:一个采集数据,一个显示图形,怎样使得采集一定数量的数据后再调用显示图形线程,并保证数据没有丢失?
开始采集:
hMutex:=Createsemaphore(nil,1,1,nil);//创建互斥量
DataCollectThread := TDataCollectThread.Create(true);
// 创建线程进行数据采集和显示
DataCollectThread.Resume;
DataShowThread := TDataShowThread.Create(true);
// 创建线程进行数据采集和显示
DataShowThread.Resume;
采集线程:
while not Terminateddo
// 当线程没有被停止
if WaitForSingleObject(hMutex1,INFINITE)=WAIT_OBJECT_0 then
//防止其他线程进入同步区域
begin
采集一定数量的数据及相关处理
end;
ReleaseSemaphore(hmutex,1,nil);
图形显示线程:
while not Terminateddo
// 等待数据采集一批数据完成
begin
图形显示
end;
出现问题:数据采集没有完成就开始画图
 
可能要改为:
采集线程:
while not Terminateddo
// 当线程没有被停止
if WaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0 then
//防止其他线程进入 begin
采集一定数量的数据及相关处理
ReleaseSemaphore(hmutex,1,nil);
end;
图形显示线程:
while not Terminateddo
if WaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0 then
// 等待数据采集一批数据完成
begin
图形显示
ReleaseSemaphore(hmutex,1,nil);
end;
 
labelsoft:
谢谢你!我试过了,不行。
采集线程采集到一批数据后,在图形显示线程 WaitForSingleObject(hMutex,INFINITE)并不等于WAIT_OBJECT_0 then
,所以没有执行图形显示过程。
然后返回采样线程,if WaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0 then
就无限等待下去了。
再指点指点!
 
用事件
开始采集:
hEvent:=CreateEvent(nil,true,false,nil);//创建事件
hMutex:=Createsemaphore(nil,1,1,nil);//创建互斥量
DataCollectThread := TDataCollectThread.Create(true);
// 创建线程进行数据采集和显示
DataCollectThread.Resume;
DataShowThread := TDataShowThread.Create(true);
// 创建线程进行数据采集和显示
DataShowThread.Resume;
采集线程:
while not Terminateddo
// 当线程没有被停止
begin
if WaitForSingleObject(hMutex1,INFINITE)=WAIT_OBJECT_0 then
//防止其他线程进入同步区域
begin
采集一定数量的数据及相关处理
end;
if 采集完成 then
SetEvent(hEvent);
ReleaseSemaphore(hmutex,1,nil);
end;

图形显示线程:
while not Terminateddo
// 等待数据采集一批数据完成
begin
if WaitForSingleObject(hEvent,INFINITE)=WAIT_OBJECT_0 then

图形显示
end;
出现问题:数据采集没有完成就开始画图

 
yanghai0437:
你好!采集完第一批数据后,图形显示线程一直在执行,并不等待下一批数据采集完成:
if WaitForSingleObject(hEvent,INFINITE)=WAIT_OBJECT_0 then

图形显示
是否还缺点释放事件什么的?
 
图形显示需要数据一批批采集.
每批采集完后,就发给图形显示.
图形显示完,返回(如果采用线程,就挂起图形线程)
如果数据采集完上次图形还没显示完,那么就冲掉旧数据,显示新图形.
数据和图形显示可以分开做,采用PostMessage.当然这需要看你采集数据速度和图形显示速度.

 
不太明白。你意思是说采集之前挂起图形显示线程,采集完一批数据再resume线程?能否再说具体点。
 
后退
顶部