如何在C#中实现精确的游戏循环帧限制?
我正在尝试在用C#编写的游戏引擎中实现游戏循环框架限制器.有人告诉我Thread.Sleep需要几毫秒才能执行Thread.Sleep(0),并且会错过目标毫秒.因此,对于我需要的东西还不够精确,因为目标帧速率可以要求发动机坐下并等待1毫秒.我不确定我是否应该在此中使用Thread.SpinWait,因为在某些情况下,引擎需要等待10毫秒,而且我不知道在这种情况下,使用SpinWait是个坏主意. 这是一个代码段,可以说明我要实现的目标: public void Run() { var targetDelta = TimeSpan.FromSeconds(0.016); Running = true; while (Running) { // Calculate time since previous frame start here ("delta") // Simplified, but essential
10 2024-04-26
编程技术问答社区
编辑图形对象的属性 c#
我目前正在尝试使用c#中的Windows表单上的图形对象的线程实现交替的颜色. 绘制线路的代码工作如下: public void DrawLine(int toX,int toY) //draw line { g.DrawLine(currPen, xPos, yPos, toX, toY); xPos = toX; yPos = toY; } 在画布类顶部分配的变量如下: Graphics g; public static Pen Red, Blue, Green, redGreen; public static int xPos, yPos; public static Pen currPen; public static Thread newThread; public static bool flag = false; public st
16 2024-04-26
编程技术问答社区
如何同时显示闪屏和我的 JFrame?
我在飞溅屏幕上工作.我设法上了一堂课.以下是显示飞溅屏幕的类.我的问题是,如果我从Jframe调用此类并运行,Jframe和Splash屏幕都同时运行,并且在持续时间后,Splash屏幕应该可以持续关闭.我如何同时显示它们? 谢谢一堆 public class Splash extends JWindow { AbsoluteLayout abs; AbsoluteConstraints absImage, absBar; ImageIcon image; JLabel label; JProgressBar bar; public Splash() { abs = new AbsoluteLayout(); absImage = new AbsoluteConstraints(0, 0); absBar = new AbsoluteConstraints(0, 210); label = new JLabel(); image =
42 2024-04-22
编程技术问答社区
长期运行的阻断方法。阻塞、睡眠、开始/结束和异步之间的区别
这个问题与设计或模式有关,以及要使用的问题.这个问题的核心是关于线程和阻塞的情况. 此示例是应用于旨在连续执行相同动作的任何阻止方法.在这种情况下,它是在网络流上的阻止读写或写入.幕后是否有明显的区别在方法之间的线程和性能? 之间 我的假设是下面的每种方法都会创建线程或使用汇总线程.然后阻止该线程直到有数据要读取.话虽如此,在这种情况下,方法之间的线程,性能和可伸缩性有明显的区别吗? 当前我正在创建一个服务器应用程序.该应用程序将有1000个客户端创建TCP连接.这些连接将保持打开状态,经常发送和接收少量数据.我希望使用模型A,因为它是最容易实施和最可维护的.无论选择哪种模式,我都会得到1000个线程吗? 请注意,这些方法只是为了了解结构,而不是如果没有适当的流读,超时和例外处理. 方法A:阻止 Task.Factory.StartNew(ReadMessage,TaskCreationOptions.LongRunning); private void
10 2024-04-22
编程技术问答社区
如何正确暂停/延时Windows窗体应用程序
我是OOP的初学者和C#. 我正在使用Windows表单进行测验游戏. 我的问题与两个类别有关,即表格和游戏逻辑. 我有一个基本的UI,带有经典的Froms控件.看看. 我要实现的目标是,当玩家按任何答案按钮时,它将按照红色或绿色按下按钮,具体取决于它是对还是错误的答案.更改颜色后,我希望程序等待一段时间,然后转到下一个问题. Probelm是,我不知道如何正确实现这一目标.我不知道如何使用线程以及表单应用程序如何与线程相关.我应该使用线程睡眠或计时器或异步吗? 我将向您展示游戏逻辑类中的方法. public static void Play(char answer) //Method gets a char representing a palyer answer { if (_rightAnswer == answer) //If the answer is true, the button should become green
18 2024-04-20
编程技术问答社区
Thread.Sleep是否阻碍了其他线程?
这是一个控制台程序,想要10个线程从批处理开始,等待5秒,然后在批处理中停止. static void Main(string[] args) { System.Threading.Tasks.Parallel.For(0, 10, (index) => { Action act = (i) => { Console.Write("start {0} ", i); Thread.Sleep(5000); }; act.BeginInvoke(index, OnTaskComplete, index); }); Console.ReadKey(); } static void OnTaskComplete(IAsyncResult res) { Console.Write("finish {0} ", res.Asyn
0 2024-04-18
编程技术问答社区
当使用Thread.Sleep()时,异步编程是如何与线程一起工作的?
推定/前奏: 在以前的问题中,我们注意到Thread.Sleep块线程请参见:何时使用任务. 我们还注意到,控制台应用程序具有三个线程:主线程,GC线程和最终线程IIRC.所有其他线程都是调试器线程. 我们知道,异步不会旋转新线程,而是在同步上下文上运行,"仅在方法处于活动状态时才在线程上使用时间". 设置: 在示例控制台应用程序中,我们可以看到,兄弟姐妹和父码都不受到Thread.Sleep的呼叫的影响,至少在调用等待(如果进一步)之前. . var sw = new Stopwatch(); sw.Start(); Console.WriteLine($"{sw.Elapsed}"); var asyncTests = new AsyncTests(); var go1 = asyncTests.WriteWithSleep(); var go2 = asyncTests.WriteWithoutSleep(); await go1; await go2; s
6 2024-04-17
编程技术问答社区
替代线程.
我在Visual Studio 2008中在C#中做所有这些. 我想放慢算法的工作,以便用户可以观看其工作.在GUI上有周期性的更改,所以我在每个实例之后添加了Thread.Sleep. 问题是,Thread.Sleep在设置为至少一秒钟后,在几个实例Thread.Sleep(几个循环后)之后,只需冻结整个GUI,并以这种方式保持直到程序完成.不是马上,但总是会发生.多久取决于睡眠的长度. 我有证据表明整个程序都没有冻结,它在起作用,即使睡眠也在暂停正确的长度.但是GUI在某些点冻结,直到算法结束为止,此时它显示了正确的最终状态. 如何解决这个问题?替代在某些点暂停算法? 解决方案 首先,不要让用户等待完成之前完成的工作.没有用.请说不. 第二,您是在"睡觉" UI线程.这就是为什么UI线程"锁定"的原因. UI线程无法阻止;如果是这样,UI线程将无法更新表单上的控件并响应系统消息.响应系统消息是UI线程的重要任务;无法这样做会使您的应用程序看起来锁
14 2024-04-17
编程技术问答社区
我是否应该总是使用Task.Delay而不是Thread.Sleep?
我最近看到了一些建议,指出Thread.Sleep绝不应该在生产代码中使用(最近在这个问题).其中许多倡导使用Task.Delay.我发现的大多数解释都以UI应用程序为示例,因为对Task.Delay的优势是显而易见的(不阻止UI). 就我而言,我在等待循环中使用Thread.Sleep,该循环对特定条件进行轮询WCF服务,例如: DateTime end = DateTime.UtcNow + TimeSpan.FromMinutes(2); while (DateTime.UtcNow
2 2024-04-15
编程技术问答社区
Thread.Sleep(0)并不像描述的那样工作?
我目前正在阅读这篇出色的文章有关线程的文章并阅读以下文本: 线程(0)立即放弃线程的当前时间切片,自愿移交给其他线程. 我想对此进行测试,以下是我的测试代码: static string s = ""; static void Main(string[] args) { //Create two threads that append string s Thread threadPoints = new Thread(SetPoints); Thread threadNewLines = new Thread(SetNewLines); //Start threads threadPoints.Start(); threadNewLines.Start(); //Wait one second for threads to manipulate string s Thread.Sleep(1000);
2 2024-04-15
编程技术问答社区
如果我的Thread.Sleep(),它真的在忙着等待吗?
我的问题在定义上有点挑剔: 下面的代码可以描述为"忙着等待"?尽管它使用thread.sleep()允许上下文切换? while (true) { if (work_is_ready){ doWork(); } Thread.Sleep(A_FEW_MILLISECONDS); } ps-当前忙于在维基百科等待的定义表明,这是一种忙碌等待的"浪费不那么浪费". 解决方案 任何投票循环,无论投票操作之间的时间如何,都忙于等待.当然,睡几毫秒的睡眠比根本没有睡眠要少得多,但它仍然涉及处理:线程上下文开关和一些最小的状况检查. 非企业等待是一个阻止呼叫.您示例的非企业版本将涉及等待同步原始版本,例如事件或条件变量.例如,此伪代码: // initialize an event to be set when work is ready Event word_is_ready; work_is_ready.Reset();
10 2024-04-14
编程技术问答社区
当用来暂停一个线程时,循环的Thread.Sleep()会不会对性能不好?
使用Thread.Sleep()方法有很多(或有)关于好还是坏话.据我了解,主要用于调试目的. 现在我想知道:用于我的特定目的是不好的,也就是说,不断地循环以暂停/恢复线程吗?我这样做是因为我想暂停执行I/O操作的线程并能够以简单的方式恢复它. I/O操作基本上只是将4096字节的块写入文件,直到所有数据都写入其中.由于该文件可能很大,并且需要很长时间,所以我想能够暂停操作(如果它会开始吃大量的系统资源). 我的代码,vb.net版本: 'Class level. Private BytesWritten As Long = 0 Private Pause As Boolean = False 'Method (thread) level. While BytesWritten
12 2024-04-13
编程技术问答社区
在短时间内使用Thread.Sleep的问题
我有一个带有2个线程的应用程序(现在),但是似乎函数thread.sleep()无法正常工作.它睡着线程,但需要更多的时间(例如 - 我想睡5毫秒,并且睡觉为0,3或更多).这是代码: int vlakien = 2; Thread[] vlakna; vlakna = new Thread[vlakien]; for (int i = 0; i
6 2024-04-12
编程技术问答社区
在不冻结用户界面的情况下,Thread.Sleep()。
首先,我是C#的初学者,我想做到这一点: class2.method_79(null, RoomItem_0, num, num2, 0, false, true, true); System.Threading.Thread.Sleep(250); class2.method_79(null, RoomItem_0, num, num4, 0, false, true, true); System.Threading.Thread.Sleep(300); class2.method_79(null, RoomItem_0, num, num6, 0, false, true, true); 但是,此解决方案冻结了UI,我如何使第二个事件发生在第一个等之后250ms,而不会冷冻UI? 解决方案 使用睡眠的最简单方法而不冻结UI线程是使您的方法异步.为了使您的方法异步添加 async 修饰符. private void someMethod() to pr
6 2024-04-10
编程技术问答社区
在WPF中,如何在做一个操作之前设置延迟
我尝试使用以下代码在导航到下一个窗口之前进行2秒延迟.但是该线程首先调用,并显示了微秒的文本块并降落到下一页.我听说一个调度员会这样做. 这是我的片段: tbkLabel.Text = "two mins delay"; Thread.Sleep(2000); Page2 _page2 = new Page2(); _page2.Show(); 解决方案 呼叫thread.sleep正在阻止UI线程.您需要异步等待. 方法1:使用dispatchertimer tbkLabel.Text = "two seconds delay"; var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) }; timer.Start(); timer.Tick += (sender, args) => { timer.Stop(); var page
6 2024-04-10
编程技术问答社区
睡眠函数是睡眠所有线程还是只睡眠调用它的那个线程?
我正在使用Linux(CentOS)上的Pthread进行编程?我想让线程入睡很短的时间来等待东西.我正在尝试使用sleep(),纳米leep()或usleep(),或者也许可以做到这一点.我想问:睡眠功能是否睡眠所有线程,或者只是打电话给它的人?任何建议或参考都将受到赞赏. void *start_routine () { /* I just call sleep functions here */ sleep (1); /* sleep all threads or just the one who call it? what about nanosleep(), usleep(), actually I want the threads who call sleep function can sleep with micro-seconds or
12 2024-04-06
编程技术问答社区
Java.awt.robot mousepress没有任何效果
我正在尝试使用AWT.robot模拟左键单击其他程序,并使用以下代码: int mask = InputEvent.BUTTON1_DOWN_MASK; bot.mouseMove(x, y); bot.mousePress(mask); bot.mouseRelease(mask); 当这将鼠标移至屏幕的正确部分时,另一个程序似乎没有接收单击.我在做什么错? 在某些其他程序中,这种相同的方法会产生点击,但是在一个程序中,它没有效果. 我尝试过Thread.sleep()在Mousemove和Mousepress之间等待30-300毫秒,但没有效果. 我是否需要使用JNI和本机Windows API来实现这一目标?我在Windows 8. 解决方案 您正在使用错误的掩码:InputEvent.BUTTON1_MASK 其他解决方案 您是否尝试过bot.mousePressed(mask)和bot.mouseReleased(mask)?
6 2024-03-22
编程技术问答社区
Task.Delay()和new Task(()=>Thread.Sleep())之间的区别
我正在整理一个小的小演示,以模拟用Thread.Sleep()模拟的长期运行方法,并想添加异步以轻松从同步过程转到异步一个.这是初始代码: private void button1_Click(object sender, EventArgs e) { LongProcess(); } private void LongProcess() { for (int i = 0; i Thread.Sleep(1000)),例如: private void button1_Click(object sender, EventArgs e) {
10 2024-03-18
编程技术问答社区
是否有java线程中断异步队列并放入alertable?
喜欢下面的链接,是否有java函数中断线程异步队列并放入可警报的函数? 我想在Java中发挥异步计时器功能.我检查了它在C ++中起作用.但是我不知道它是否在Java. 当主线程运行并定期检查是否有异步计时器启动并运行它并返回并再次运行.那就是我想做的. 当然,在检查异步计时器时,我将使用可警报的睡眠. 我试图在Google中找到它,但没有找到. 预先感谢! 我想做的更多细节在下面. 让我们假设有一个程序得到以下请求: msg1 : msgname=aa1 to=sub1 waittime=1000 msgbody msg2 : msgname=aa2 to=sub2 waittime=2000 msgbody msg3 : msgname=aa3 to=sub1 waittime=3000 msgbody msg4 : msgname=aa3 to=sub1 msgbody . . ,该程序应将每个MSG传递给sub1,sub2中描述的sub2到
8 2024-03-18
编程技术问答社区
并发异步/等待睡眠
我想知道这个相当古老的问题关于期货的问题仍然适用于最新的语言构造async/await.似乎是这样,因为下面的代码打印: hello good bye hello 尽管 期货::加入宏使等待多个不同的期货在执行它们时都可以完成. 显然,关于sleep> sleep. 有这样的基本原因? use std::time::Duration; use std::thread; async fn sayHiOne() { println!( " hello " ); thread::sleep( Duration::from_millis( 3000 ) ); println!( " good bye " ); } // () async fn sayHiTwo() { println!( " hello " ); } // () async fn mainAsync() { let fut1 = sayHiOne();
14 2024-03-17
编程技术问答社区