我正在寻找一些关于使我的代码更高效的建议。我想要做的是让System.Threading.Timer一个每小时左右运行一些工作,这项工作不会很繁重,但我想要一个不占用太多资源的代码。我计划在 Windows 服务中运行此代码。
这是我到目前为止。
class Program
{
private static Timer timer;
static void Main(string[] args)
{
SetTimer();
}
static void SetTimer()
{
timer = new Timer(Write);
var next = DateTime.Now.AddHours(1);
var nextSync = (int)(next - DateTime.Now).TotalMilliseconds;
timer.Change(nextSync, Timeout.Infinite);
}
static void Write(object data)
{
Console.WriteLine("foo");
SetTimer(); //Call the SetTimer again for the next run.
}
}
Run Code Online (Sandbox Code Playgroud)
你们有什么感想?我可以让我的代码更有效率吗?
非常感谢所有建议!
我阅读了 MSDN 网站和所有内容,但我找不到关于如何引发一个定时事件的简单解释,该事件接受可以是 astring或 的参数double。提供的示例使用ElapsedEventArgs但没有显示出实现我自己对引发事件的论点的好方法。
我的代码(我没有测试过,所以可能是错误的):
private double Pressure_Effect(double p, int t){
time=(double) t;
v=(((p/(rho*y))-g)*time)/(1.0+(mu*time/(rho*y*x)));
return v;
}
private void Time_Handle(){
System.Timers.Timer startTimer=new System.Timers.Timer(70);
startTimer.Elapsed += new ElapsedEventHandler(Activate_Pressure);
}
private void Activate_Pressure(object source, ElapsedEventArgs e){
pressure=2.5;
double v=Pressure_Effect(pressure, 70);
}
Run Code Online (Sandbox Code Playgroud)
我想做的是Activate_Pressure多余的,因为如果我可以直接将事件传递给我Pressure_Effect,但我不知道如何传递。我是 C# 新手,所以请耐心等待。我知道我没有启用计时器,并且此代码中可能缺少其他关键部分,但我只是发布它来澄清我的问题。
我正在制作一个小型GUI应用程序,我在其中创建了一个弹出对话框,提示用户按OK或CANCEL.如果用户按下OK,则会保存一些更改,如果用户按CANCEL,则会丢弃更改.
现在,我想在QLabel对象内的对话框中放一个计时器,它将显示如下 -

在5秒内发送消息,在4秒内发送消息,.. ..在1秒内发送消息.
倒计时结束后,将考虑默认"OK",并保存所有更改.如何在GUI应用程序上实现这样的视觉效果?我的意思是实现一个concole计时器很容易,但如何通过GUI屏幕可视化计时器??? 任何帮助..
我终于设法使我的24小时非日期可靠的倒数计时器。这样做的目的是,每当有人访问该网站时,倒计时就会开始。问题在于,当任何单位(小时,分钟,秒)达到个位数时,值将按原样显示它们而不是标准时间格式(应按9分钟而不是09分钟显示)。我如何实现一个条件,如果值<= 9会在其前面加上0?
var count = 86400;
var counter = setInterval(timer, 1000); //1000 will run it every 1 second
function timer() {
count = count - 1;
if (count == -1) {
clearInterval(counter);
return;
}
var seconds = count % 60;
var minutes = Math.floor(count / 60);
var hours = Math.floor(minutes / 60);
minutes %= 60;
hours %= 60;
document.getElementById("timer").innerHTML = hours + ":" + minutes + ":" + seconds; // watch for spelling
}Run Code Online (Sandbox Code Playgroud)
<span id='timer'></span>Run Code Online (Sandbox Code Playgroud)
我需要定期调用一个方法而不使用Timer类.该方法将由多线程调用.
我有一个关于创建一个可以等待的计时器的想法,而不是引发事件。我还没有想到任何实际应用,可能不是非常有用的东西,但我想看看它是否至少可以作为练习。这是它的用法:
var timer = new System.Timers.Timer();
timer.Interval = 100;
timer.Enabled = true;
for (int i = 0; i < 10; i++)
{
var signalTime = await timer;
Console.WriteLine($"Awaited {i}, SignalTime: {signalTime:HH:mm:ss.fff}");
}
Run Code Online (Sandbox Code Playgroud)
计时器等待 10 次,预期输出为:
等待 0,信号时间:06:08:51.674
等待 1,信号时间:06:08:51.783
等待 2,信号时间:06:08:51.891
等待 3,信号时间:06:08:52.002
等待 4,信号时间:05:108:
等待 5、信号时间:06:08:52.218
等待 6、信号时间:06:08:52.332
等待 7、信号时间:06:08:52.438
等待 8、信号时间:06:08:52.546
等待 06:52.332 信号时间:06:08:52.0608:
在这种情况下,一个简单的await Task.Delay(100)会做同样的事情,但计时器提供了从程序的另一部分控制间隔的灵活性(注意可能的线程安全问题)。
关于实现,我找到了一篇文章,描述了如何使各种事物成为可等待的,例如 a TimeSpan、 an int、 aDateTimeOffset和 a Process。似乎我必须编写一个返回 a 的扩展方法TaskAwaiter …
我只是用计时器创建一个线程。即使我导入了我需要的所有库。它一直告诉我们没有对函数的引用。
正是它说的,timer_create(...)并且没有timer_settime(...)被引用。
这些是我的进口:
#include <stdio.h>
#include <stddef.h>
#include <sched.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
Run Code Online (Sandbox Code Playgroud)
这是我使用这些函数的线程:
void *Turismo(){
const struct timespec periodo = {per_turismos_sec,per_turismos_nsec};
struct sigevent event;
timer_t timer;
struct itimerspec its;
sigset_t sigset;
int signum;
event.sigev_notify = SIGEV_SIGNAL;
event.sigev_signo = SIGRTMAX;
event.sigev_value.sival_ptr = &timer;
if(timer_create(CLOCK_MONOTONIC,&event,&timer)!=0) error();
its.it_interval = periodo;
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 1;
if(timer_settime(timer,0,&its,NULL)<0) error();
if(sigemptyset(&sigset)<0) error();
if(sigaddset(&sigset,SIGRTMAX)<0) error();
while(1){
sigwait(&sigset,&signum);
// ESPECIFICACION DE LA …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译boost计时器,它正在抛出我不明白的错误.它让我觉得计时器库已被打破:
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/timer/timer.hpp>
int main(int argc, char **argv) {
// auto_cpu_timer t;
std::cout << boost::lexical_cast<std::string>(2.0) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果没有#include for timer.hpp,它就会编译.有了它,它会引发以下错误:
Invoking: GCC C++ Linker
g++ -Lsrc -o "timetest" ./src/main.o
./src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [timetest] Error 1
Run Code Online (Sandbox Code Playgroud)
这是否意味着计时器库被破坏了?我正在使用Boost 1.49.0.
谢谢!
如何为这个倒计时器设置cookie?当我刷新页面时,cookie应该阻止重置计时器.
<div id="hms">02:00:00</div>
<script type="text/javascript">
function count() {
var startTime = document.getElementById('hms').innerHTML;
var pieces = startTime.split(':');
var time = new Date();
time.setHours(pieces[0]);
time.setMinutes(pieces[1]);
time.setSeconds(pieces[2]);
var timedif = new Date(time.valueOf() - 1000);
var newtime = timedif.toTimeString().split(' ')[0];
document.getElementById('hms').innerHTML = newtime;
setTimeout(count,1000);
}
count();
</script>
Run Code Online (Sandbox Code Playgroud) 我的代码不起作用.我究竟做错了什么?
function christmas(){
var today = new Date();
var day = today.getDate();
var month = today.getMonth()+1;
if(day>=0 && month=12){
var script = document.createElement('script');
script.src = "files/snowstorm.js";
document.getElementsByTagName('head')[0].appendChild(script);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在制作一个游戏,其中有一个计时器显示当前会话已经过了多长时间.我已经按照几个教程阅读文档,似乎无法弄清楚为什么会返回错误.这是我的代码:
var timerT = Timer()
func startTimer () {
self.timerT = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timeFunc), userInfo: nil, repeats: true)
}
@objc func timeFunc (_ timer: Timer) {
timeS += 1
}
@IBAction func newGameAction(_ sender: UIButton) {
Timer.invalidate(timerT)
game = SetGame()
updateUIfromModel()
startTimer()
}
Run Code Online (Sandbox Code Playgroud)
很多Mahalo.