首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

多线程 怎么让某个线程保证隔一段时间运行

2012-04-23 
多线程 如何让某个线程保证隔一段时间运行系统采用多线程,其中一个线程想要每隔一秒保存一次数据当前设定

多线程 如何让某个线程保证隔一段时间运行
系统采用多线程,其中一个线程想要每隔一秒保存一次数据
当前设定该线程优先级为最高THREAD_PRIORITY_HIGHEST或者THREAD_PRIORITY_TIME_CRITICAL
但采集的数据仍然会有丢失,即隔几分钟就有一秒没有采集
while(1)
{
  。。。。。。
  end_time
  n=end_time-start_time
  sleep(1000-n);
  start_time
}
这样做了之后稍微好一点,但还是会有丢失。。。还有没有什么好办法?

[解决办法]
SetThreadPriority & CeSetThreadPriority 是不同的, 建議 LZ 用 CeSetThreadPriority(hThread, 0) 即可.

Paul, Chao @ Techware

[解决办法]
楼主可以试试,另开一个线程B,用GetTickCount函数获取起始时间点跟当前时间点,两者相减大于900ms的时候就可以在A线程中进行保存数据的操作了, WinCE线程时间调度大约为100ms,这样子应该不会丢,定时也基本准确吧
[解决办法]
一般线程的优先级尽量不要设置太高,一般normal或者low_normal就可以了
至于数据丢失的问题,

建议是这样(假设是同一个进程)
(若不是同一个进程,建议使用Mutex)
(1)A线程更新数据,如有更新数据,
AthreadProc
{
//===
.....your code out while
//===
while(true)
{
//===
.....your code
//===
section.lock();
setFlag=true;
//(读取数据部分)
section.unlock();
}
}

(2)B线程读取setFlag,
BthreadProc
{
//===
.....your code out while
//===
while(true)
{

//===
.....your code
//===
if(setFlag)
{
section.lock();
setFlag=false;
//(读取数据部分)
section.unlock();
}
}
}
[解决办法]
一定要1秒钟一次保存,不能根据数据实时更新保存吗?

LZ方便说说原因吗?

我说的这个方法就是实时保存,去写数据的时候setFlag=true;
读线程去一直判断setFlag的状态,如果为true就去保存数据,

当然线程之间要有同步...

探讨

可是如何能够控制A线程的读取是每隔1s发生的呢?
由于线程调度时间的存在,有时候实际上是间隔了1.0001s发生的,长时间的累积,就会导致有个别秒没有采集到数据。。。
引用:

一般线程的优先级尽量不要设置太高,一般normal或者low_normal就可以了
至于数据丢失的问题,

建议是这样(假设是同一个进程)
(若不是同一个进程,建议使用Mutex)
……

[解决办法]
LZ是进行A/D转换,每秒采集一次吗?

如果是这样,我觉得应该考虑采样率和采样周期,保证你的采样秒数和采样周期匹配
不然就会有漏掉的情况。。

还有采样的数据也尽量考虑有上限和下限值,

[Quote=引用:]

可是如何能够控制A线程的读取是每隔1s发生的呢?
由于线程调度时间的存在,有时候实际上是间隔了1.0001s发生的,长时间的累积,就会导致有个别秒没有采集到数据。。。
引用:

一般线程的优先级尽量不要设置太高,一般normal或者low_normal就可以了
至于数据丢失的问题,

建议是这样(假设是同一个进程)
(若不是同一个进程,建议使用Mutex)
……
[/Quote]
[解决办法]
那你就定义一个COUNT,数据发送过来,count就加1,

onrevievedCmd(param,lparam)
{
count ++;
if(count==5)
{
//do what you want
//sendmessage(WM_MY_PAINT,wparam,lparam);
count=0;
}
}

你可以把5定义一个常量,方便修改

探讨

LZ是进行A/D转换,每秒采集一次吗?

如果是这样,我觉得应该考虑采样率和采样周期,保证你的采样秒数和采样周期匹配
不然就会有漏掉的情况。。

还有采样的数据也尽量考虑有上限和下限值,

[Quote=引用:]

可是如何能够控制A线程的读取是每隔1s发生的呢?
由于线程调度时间的存在,有时候实际上是间隔了1.0001s发生的,长时间的累……

热点排行