请教线程执行时间与频率问题

时间:2021-04-29 18:11:38
我现在有一线程,该线程本身执行时间有时会大于100毫秒,如果我将此线程的执行频率设定为50毫秒,想了解该线程是如何执行的,会不会产生某一大于100毫秒线程中的执行未完成系统还会启动一个新的线程

17 个解决方案

#1


是否等待还是启动新线程,这取决于你的代码是如何写的

#2


引用 1 楼 xdashewan 的回复:
是否等待还是启动新线程,这取决于你的代码是如何写的


也就是说该线程中须要在首尾处使用block和unblock是么?

#3


引用 1 楼 xdashewan 的回复:
是否等待还是启动新线程,这取决于你的代码是如何写的


请问如果需要等待,该如何处理

#4


引用 3 楼 ttitt147 的回复:
请问如果需要等待,该如何处理

可以使用ThreadPool,参照http://www.cnblogs.com/SkySoot/archive/2012/04/01/2429259.html

#5


MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?

#6


引用 4 楼 xdashewan 的回复:
Quote: 引用 3 楼 ttitt147 的回复:

请问如果需要等待,该如何处理

可以使用ThreadPool,参照http://www.cnblogs.com/SkySoot/archive/2012/04/01/2429259.html


感谢

#7


引用 4 楼 xdashewan 的回复:
Quote: 引用 3 楼 ttitt147 的回复:

请问如果需要等待,该如何处理

可以使用ThreadPool,参照http://www.cnblogs.com/SkySoot/archive/2012/04/01/2429259.html


如果是如下形式
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

请问如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行? 

#8


引用 5 楼 ttitt147 的回复:
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);
如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?

会,如果要用定时器,那么你需要动态计算定时器的触发时间

#9


引用 5 楼 ttitt147 的回复:
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?


构造函数最后一个参数为-1时,定时器只会执行1次。

MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, -1);

线程函数最后加上
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 50, -1);

这样就能保证不会同时有2个ScanAndSortThread运行了。

#10


引用 9 楼 qbilbo 的回复:
Quote: 引用 5 楼 ttitt147 的回复:

MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?


构造函数最后一个参数为-1时,定时器只会执行1次。

MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, -1);

线程函数最后加上
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 50, -1);

这样就能保证不会同时有2个ScanAndSortThread运行了。


谢谢

#11


引用 楼主 ttitt147 的回复:
我现在有一线程,该线程本身执行时间有时会大于100毫秒,如果我将此线程的执行频率设定为50毫秒,想了解该线程是如何执行的,会不会产生某一大于100毫秒线程中的执行未完成系统还会启动一个新的线程


看不懂。什么叫做“线程执行频率”?线程中你去执行一个方法,假设两个线程同时都在执行同一个方法,那么就是同一个方法的两个执行实例在并发着。这很“正常”,不应该奇怪。

#12


引用 3 楼 ttitt147 的回复:
Quote: 引用 1 楼 xdashewan 的回复:

是否等待还是启动新线程,这取决于你的代码是如何写的


请问如果需要等待,该如何处理


这就谈不上“线程等待”,而是你的前一个方法执行开始的时候应该关闭定时器,然后方法执行到最后的时候才启动定时器。

不要滥用线程这个概念,要按照常规的、基础的方式考虑程序设计问题。

#13


引用 12 楼 sp1234 的回复:
Quote: 引用 3 楼 ttitt147 的回复:

Quote: 引用 1 楼 xdashewan 的回复:

是否等待还是启动新线程,这取决于你的代码是如何写的


请问如果需要等待,该如何处理


这就谈不上“线程等待”,而是你的前一个方法执行开始的时候应该关闭定时器,然后方法执行到最后的时候才启动定时器。

不要滥用线程这个概念,要按照常规的、基础的方式考虑程序设计问题。


谢谢

#14


System.Threading.Timer 对象实例,要临时停止定时,使用 change 方法;要启用它,也是使用 change 方法。不是重新创建对象 Timer 类型实例。

#15


引用 14 楼 sp1234 的回复:
System.Threading.Timer 对象实例,要临时停止定时,使用 change 方法;要启用它,也是使用 change 方法。不是重新创建对象 Timer 类型实例。

多谢

实例:MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

void ThreadFunction()
{
线程函数头临时停止:MotionTim.change((new TimeSpan(-1), new TimeSpan(0, 0, 0, 50));
.
线程函数
.
线程函数尾重新启用:MotionTim.change((new TimeSpan(0), new TimeSpan(0, 0, 0, 50));
}

这样可以么?

#16


引用 14 楼 sp1234 的回复:
System.Threading.Timer 对象实例,要临时停止定时,使用 change 方法;要启用它,也是使用 change 方法。不是重新创建对象 Timer 类型实例。


多谢

 实例:MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

 void ThreadFunction()
 {
线程函数头临时停止:MotionTim.change(-1,  50);
 .
线程函数
.
线程函数尾重新启用:MotionTim.change(0,  50);
 }

这样可以么? 

#17


这个叫线程定时器!!!!
你提的问题做个很点单是实验就解决了,何必提问这么麻烦

#1


是否等待还是启动新线程,这取决于你的代码是如何写的

#2


引用 1 楼 xdashewan 的回复:
是否等待还是启动新线程,这取决于你的代码是如何写的


也就是说该线程中须要在首尾处使用block和unblock是么?

#3


引用 1 楼 xdashewan 的回复:
是否等待还是启动新线程,这取决于你的代码是如何写的


请问如果需要等待,该如何处理

#4


引用 3 楼 ttitt147 的回复:
请问如果需要等待,该如何处理

可以使用ThreadPool,参照http://www.cnblogs.com/SkySoot/archive/2012/04/01/2429259.html

#5


MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?

#6


引用 4 楼 xdashewan 的回复:
Quote: 引用 3 楼 ttitt147 的回复:

请问如果需要等待,该如何处理

可以使用ThreadPool,参照http://www.cnblogs.com/SkySoot/archive/2012/04/01/2429259.html


感谢

#7


引用 4 楼 xdashewan 的回复:
Quote: 引用 3 楼 ttitt147 的回复:

请问如果需要等待,该如何处理

可以使用ThreadPool,参照http://www.cnblogs.com/SkySoot/archive/2012/04/01/2429259.html


如果是如下形式
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

请问如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行? 

#8


引用 5 楼 ttitt147 的回复:
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);
如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?

会,如果要用定时器,那么你需要动态计算定时器的触发时间

#9


引用 5 楼 ttitt147 的回复:
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?


构造函数最后一个参数为-1时,定时器只会执行1次。

MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, -1);

线程函数最后加上
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 50, -1);

这样就能保证不会同时有2个ScanAndSortThread运行了。

#10


引用 9 楼 qbilbo 的回复:
Quote: 引用 5 楼 ttitt147 的回复:

MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

如果ScanAndSortThread本身有时执行超过50毫秒,会不会某一时间有两个ScanAndSortThread在执行?


构造函数最后一个参数为-1时,定时器只会执行1次。

MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, -1);

线程函数最后加上
MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 50, -1);

这样就能保证不会同时有2个ScanAndSortThread运行了。


谢谢

#11


引用 楼主 ttitt147 的回复:
我现在有一线程,该线程本身执行时间有时会大于100毫秒,如果我将此线程的执行频率设定为50毫秒,想了解该线程是如何执行的,会不会产生某一大于100毫秒线程中的执行未完成系统还会启动一个新的线程


看不懂。什么叫做“线程执行频率”?线程中你去执行一个方法,假设两个线程同时都在执行同一个方法,那么就是同一个方法的两个执行实例在并发着。这很“正常”,不应该奇怪。

#12


引用 3 楼 ttitt147 的回复:
Quote: 引用 1 楼 xdashewan 的回复:

是否等待还是启动新线程,这取决于你的代码是如何写的


请问如果需要等待,该如何处理


这就谈不上“线程等待”,而是你的前一个方法执行开始的时候应该关闭定时器,然后方法执行到最后的时候才启动定时器。

不要滥用线程这个概念,要按照常规的、基础的方式考虑程序设计问题。

#13


引用 12 楼 sp1234 的回复:
Quote: 引用 3 楼 ttitt147 的回复:

Quote: 引用 1 楼 xdashewan 的回复:

是否等待还是启动新线程,这取决于你的代码是如何写的


请问如果需要等待,该如何处理


这就谈不上“线程等待”,而是你的前一个方法执行开始的时候应该关闭定时器,然后方法执行到最后的时候才启动定时器。

不要滥用线程这个概念,要按照常规的、基础的方式考虑程序设计问题。


谢谢

#14


System.Threading.Timer 对象实例,要临时停止定时,使用 change 方法;要启用它,也是使用 change 方法。不是重新创建对象 Timer 类型实例。

#15


引用 14 楼 sp1234 的回复:
System.Threading.Timer 对象实例,要临时停止定时,使用 change 方法;要启用它,也是使用 change 方法。不是重新创建对象 Timer 类型实例。

多谢

实例:MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

void ThreadFunction()
{
线程函数头临时停止:MotionTim.change((new TimeSpan(-1), new TimeSpan(0, 0, 0, 50));
.
线程函数
.
线程函数尾重新启用:MotionTim.change((new TimeSpan(0), new TimeSpan(0, 0, 0, 50));
}

这样可以么?

#16


引用 14 楼 sp1234 的回复:
System.Threading.Timer 对象实例,要临时停止定时,使用 change 方法;要启用它,也是使用 change 方法。不是重新创建对象 Timer 类型实例。


多谢

 实例:MotionTim = new System.Threading.Timer(new TimerCallback(ScanAndSortThread), null, 0, 50);

 void ThreadFunction()
 {
线程函数头临时停止:MotionTim.change(-1,  50);
 .
线程函数
.
线程函数尾重新启用:MotionTim.change(0,  50);
 }

这样可以么? 

#17


这个叫线程定时器!!!!
你提的问题做个很点单是实验就解决了,何必提问这么麻烦

相关文章