如果你已经使用了gui工具箱,那么你知道有一个事件循环/主循环应该在所有事情完成之后执行,并且会保持应用程序的活动并响应不同的事件。 例如,对于Qt,你可以在main()中做到这一点: int main() { QApplication app(argc, argv); // init code return app.exec(); } 在这种情况下,app.exec()是应用程序的主循环。 实现这种循环的明显方法是: void exec() { while (1) { process_events(); // create a thread for each new event (possibly?) } } 但是这将CPU限制到100%,实际上是无用的。 现在,我怎样才能实现这样一个响应而不用吃CPU的事件循环呢? 在Python和/或C ++中赞赏答案。 谢谢。 脚注:为了学习,我将实现自己的信号/插槽,并使用它们来生成自定义事件(例如, go_forward_event(steps) )。 但是,如果您知道如何手动使用系统事件,我也想知道这一点。
我刚读完Promises / A +规范,偶然发现了microtask和macrotask这两个术语:参见http://promisesaplus.com/#notes 我从来没有听说过这些条款,现在我很好奇它们有什么不同? 我已经试图在网上find一些信息,但是我发现的这个post是从w3.org档案(这不能解释我的不同之处): http : //lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html 另外,我发现了一个名为“macrotask”的npm模块: https : //www.npmjs.org/package/macrotask再一次,没有澄清究竟是什么区别。 我所知道的是,它与事件循环有关,如https://html.spec.whatwg.org/multipage/webappapis.html#task-queue和https://html.spec.whatwg中所述.ORG /多页/ webappapis.html#执行-A-microtask检查点 根据WHATWG规范,我知道理论上我应该能够自己提取差异。 但我相信其他人也可以从专家的简短解释中获益。
我有一个“开始”button和一个进度条小GUItesting。 期望的行为是: 点击开始 进度条振荡5秒钟 进度条停止 观察到的行为是“开始”button冻结5秒,然后显示一个进度条(不振荡)。 这是我的代码到目前为止: class GUI: def __init__(self, master): self.master = master self.test_button = Button(self.master, command=self.tb_click) self.test_button.configure( text="Start", background="Grey", padx=50 ) self.test_button.pack(side=TOP) def progress(self): self.prog_bar = ttk.Progressbar( self.master, orient="horizontal", length=200, mode="indeterminate" ) self.prog_bar.pack(side=TOP) def tb_click(self): self.progress() self.prog_bar.start() # Simulate long running process t = threading.Thread(target=time.sleep, args=(5,)) t.start() t.join() self.prog_bar.stop() root = Tk() […]
我在想这个,这就是我想到的: 假设我们有这样的代码: console.clear(); console.log("a"); setTimeout(function(){console.log("b");},1000); console.log("c"); setTimeout(function(){console.log("d");},0); 一个请求进来,JS引擎开始执行上面的代码一步一步。 前两个电话是同步呼叫。 但是,当涉及到setTimeout方法时,它将成为asynchronous执行。 但JS立即从它返回并继续执行,这被称为Non-Blocking或Async 。 并继续在其他等工作 这个执行的结果如下: ACDB 所以基本上第二个setTimeout首先完成,它的callback函数比第一个执行得早,这是有道理的。 我们在这里讨论单线程应用程序。 JS引擎继续执行这个,除非它完成第一个请求,它不会去第二个。 但好处是,它不会等待像setTimeout这样的阻塞操作来parsing,所以它会更快,因为它接受新的传入请求。 但是我的问题出现在以下几个方面: #1:如果我们正在讨论单线程应用程序,那么当JS引擎接受更多请求并执行它们时,什么机制处理setTimeouts呢? 单线程如何继续处理其他请求? 在其他请求保持进入并执行的情况下, setTimeout是如何工作的。 #2:如果这些setTimeout函数在更多的请求进入和执行后在幕后执行,那么在后台执行asynchronous执行是什么? 我们所说的这个叫做EventLoop东西是什么? #3:但是不应该把整个方法放在EventLoop这样整个事情就会被执行,callback方法会被调用吗? 这是我在谈论callback函数时所理解的: function downloadFile(filePath, callback) { blah.downloadFile(filePath); callback(); } 但在这种情况下,JS引擎如何知道它是否是asynchronous函数,以便将callback放入EventLoop? Perhaps something like the EventLoop? Perhaps something like the C#中EventLoop? Perhaps something like the async`关键字或某种指示JS引擎将采取的方法的属性是asynchronous方法,应该作相应的处理。 #4:但是有一篇文章与我猜测的事情可能如何工作完全相反: 事件循环是一个callback函数的队列。 当asynchronous函数执行时,callback函数被推入队列中。 JavaScript引擎不会开始处理事件循环,直到执行了asynchronous函数之后的代码。 […]
在nodejs体系结构中是否有内部的两个事件循环? libev / libuv v8 JavaScript事件循环 在I / O请求上,节点将请求排队到libeio,反过来使用libev通过事件通知数据的可用性,最后这些事件由使用callback的v8事件循环处理? 基本上,libev和libeio如何集成在nodejs架构中? 是否有任何文档可用于清楚了解nodejs内部体系结构?
我最近遇到了一个相当讨厌的bug,其中代码是通过JavaScriptdynamic加载<select> 。 这个dynamic加载的<select>有一个预先选定的值。 在IE6中,我们已经有了修改所选的<option>代码,因为有时候<select>的selectedIndex值将与select的<option>的index属性不同步,如下所示: field.selectedIndex = element.index; 但是,这个代码不起作用。 即使字段的selectedIndex设置正确,错误的索引也会被选中。 但是,如果我在正确的时间插入alert()语句,则会select正确的选项。 考虑到这可能是一些时间问题,我尝试了一些随机代码,之前我曾经看过代码: var wrapFn = (function() { var myField = field; var myElement = element; return function() { myField.selectedIndex = myElement.index; } })(); setTimeout(wrapFn, 0); 这工作! 对于我的问题,我有一个解决scheme,但是我不确定为什么这会解决我的问题。 有没有人有正式的解释? 什么浏览器问题,我通过使用setTimeout()调用我的函数“以后”避免?