线程里开定时器还是应该定时器里调用线程?

时间:2022-06-02 23:35:36
后台进行串口的通讯,每次发送接收要500ms,打算定时1s获取一次数据,不用多线程可以实现了,就是拖的主界面比较卡,现在用多线程,应该用下面哪种方法呢?
1、主线程里开一个工作者线程,此工作线程里开定时器,定时通讯;
2、主线程定时器中断调用工作者线程。
给点意见?

18 个解决方案

#1


选1   线程里开定时器还是应该定时器里调用线程?

#2


为什么要开定时器?Sleep(1000);

#3


开线程周期性做事情

#4


选1,功能独立点。
主线程定时器中断调用工作者线程。
------------
应该说主线程定时器里通知工作线程更准确点,要通知起码得要有个事件之类的,麻烦。

#5


主线程里开一个工作者线程,此工作线程里开定时器,定时通讯;
让工作线程有事就干事,没事就睡觉,不影响住线程,主线程主要检查工作线程的标记,进行处理

#6


引用 2 楼 hezhe1008 的回复:
为什么要开定时器?Sleep(1000);


那别的事情都不用干了 线程里开定时器还是应该定时器里调用线程?

#7


在主线程里开一个线程,不停的接受消息
while(1)
{
  while(读空消息)
  {
  }
  Sleep(1000);
}

#8


引用 3 楼 oyljerry 的回复:
开线程周期性做事情
线程里开定时器没什么问题的吧? 就当在主线程一样用?结束工作站线程的时候killtimer吗  

#9


引用 7 楼 hezhe1008 的回复:
在主线程里开一个线程,不停的接受消息
while(1)
{
  while(读空消息)
  {
  }
  Sleep(1000);
}
似乎是单片机里的做法 哈 应该也可以

#10


引用 5 楼 worldy 的回复:
主线程里开一个工作者线程,此工作线程里开定时器,定时通讯;
让工作线程有事就干事,没事就睡觉,不影响住线程,主线程主要检查工作线程的标记,进行处理

道理我懂的  就是不知道线程里开定时器  会不会有什么不好的? 总感觉线程不是个完整的东西   线程里开定时器还是应该定时器里调用线程?

#11


引用 10 楼 sunnyloves 的回复:
Quote: 引用 5 楼 worldy 的回复:

主线程里开一个工作者线程,此工作线程里开定时器,定时通讯;
让工作线程有事就干事,没事就睡觉,不影响住线程,主线程主要检查工作线程的标记,进行处理

道理我懂的  就是不知道线程里开定时器  会不会有什么不好的? 总感觉线程不是个完整的东西   线程里开定时器还是应该定时器里调用线程?


定时器消息有一个问题就是,如果在处理一个WM_TIMER消息的时间超过1s的话,下一个WM_TIMER消息直到前一次处理完了才会产生,不知道楼主对于这种情况是否考虑到了,如果楼主忽略此种情况,整个定时器消息也不是不可吧! 线程里开定时器还是应该定时器里调用线程?

#12


想了一晚上 线程里开定时器应该不是好办法 因为定时事件到了之后 程序还是在主线程里  
还是线程里让它while(1)死循环那里比较好

#13


线程里面定时去操作串口撒,定时器和线程性质都差不多

#14


定时器一般都是主线程开吧,在定时器里设置一个开关,在线程读取数据后关闭开关就可以了

while(1)
{
if(开关)
{
。。。
开关=false;
}
}

#15


最好是在线程中等有数据到达的时候再做,没数据的时候不占CPU资源

#16


引用 7 楼 hezhe1008 的回复:
在主线程里开一个线程,不停的接受消息
while(1)
{
  while(读空消息)
  {
  }
  Sleep(1000);
}

试了while(1)
程序关闭后会有内存泄漏 就是线程没关掉的原因 可是死循环里怎么关呢 线程又不能再接受消息了 线程里开定时器还是应该定时器里调用线程?

#17


解决了 传递的参数里加上一个变量判断就可以了 线程里开定时器还是应该定时器里调用线程?

#18


引用 15 楼 VisualEleven 的回复:
最好是在线程中等有数据到达的时候再做,没数据的时候不占CPU资源
恩 应该这样 再试试

#1


选1   线程里开定时器还是应该定时器里调用线程?

#2


为什么要开定时器?Sleep(1000);

#3


开线程周期性做事情

#4


选1,功能独立点。
主线程定时器中断调用工作者线程。
------------
应该说主线程定时器里通知工作线程更准确点,要通知起码得要有个事件之类的,麻烦。

#5


主线程里开一个工作者线程,此工作线程里开定时器,定时通讯;
让工作线程有事就干事,没事就睡觉,不影响住线程,主线程主要检查工作线程的标记,进行处理

#6


引用 2 楼 hezhe1008 的回复:
为什么要开定时器?Sleep(1000);


那别的事情都不用干了 线程里开定时器还是应该定时器里调用线程?

#7


在主线程里开一个线程,不停的接受消息
while(1)
{
  while(读空消息)
  {
  }
  Sleep(1000);
}

#8


引用 3 楼 oyljerry 的回复:
开线程周期性做事情
线程里开定时器没什么问题的吧? 就当在主线程一样用?结束工作站线程的时候killtimer吗  

#9


引用 7 楼 hezhe1008 的回复:
在主线程里开一个线程,不停的接受消息
while(1)
{
  while(读空消息)
  {
  }
  Sleep(1000);
}
似乎是单片机里的做法 哈 应该也可以

#10


引用 5 楼 worldy 的回复:
主线程里开一个工作者线程,此工作线程里开定时器,定时通讯;
让工作线程有事就干事,没事就睡觉,不影响住线程,主线程主要检查工作线程的标记,进行处理

道理我懂的  就是不知道线程里开定时器  会不会有什么不好的? 总感觉线程不是个完整的东西   线程里开定时器还是应该定时器里调用线程?

#11


引用 10 楼 sunnyloves 的回复:
Quote: 引用 5 楼 worldy 的回复:

主线程里开一个工作者线程,此工作线程里开定时器,定时通讯;
让工作线程有事就干事,没事就睡觉,不影响住线程,主线程主要检查工作线程的标记,进行处理

道理我懂的  就是不知道线程里开定时器  会不会有什么不好的? 总感觉线程不是个完整的东西   线程里开定时器还是应该定时器里调用线程?


定时器消息有一个问题就是,如果在处理一个WM_TIMER消息的时间超过1s的话,下一个WM_TIMER消息直到前一次处理完了才会产生,不知道楼主对于这种情况是否考虑到了,如果楼主忽略此种情况,整个定时器消息也不是不可吧! 线程里开定时器还是应该定时器里调用线程?

#12


想了一晚上 线程里开定时器应该不是好办法 因为定时事件到了之后 程序还是在主线程里  
还是线程里让它while(1)死循环那里比较好

#13


线程里面定时去操作串口撒,定时器和线程性质都差不多

#14


定时器一般都是主线程开吧,在定时器里设置一个开关,在线程读取数据后关闭开关就可以了

while(1)
{
if(开关)
{
。。。
开关=false;
}
}

#15


最好是在线程中等有数据到达的时候再做,没数据的时候不占CPU资源

#16


引用 7 楼 hezhe1008 的回复:
在主线程里开一个线程,不停的接受消息
while(1)
{
  while(读空消息)
  {
  }
  Sleep(1000);
}

试了while(1)
程序关闭后会有内存泄漏 就是线程没关掉的原因 可是死循环里怎么关呢 线程又不能再接受消息了 线程里开定时器还是应该定时器里调用线程?

#17


解决了 传递的参数里加上一个变量判断就可以了 线程里开定时器还是应该定时器里调用线程?

#18


引用 15 楼 VisualEleven 的回复:
最好是在线程中等有数据到达的时候再做,没数据的时候不占CPU资源
恩 应该这样 再试试