Asynchronous 瓦拉产量不回
在Vala中编写异步函数时遇到问题。Asynchronous 瓦拉产量不回,asynchronous,gtk,yield,glib,vala,Asynchronous,Gtk,Yield,Glib,Vala,在Vala中编写异步函数时遇到问题。 我知道函数的回调必须在某个地方注册,以便在yield语句之后继续执行,因此我将其添加到GLib mainloop中,以便使用Idle.add定期调用。这是我的伪代码: async void loop_func() { var id = Idle.add(loop_func.callback); message("Added idle %u",id); yield; message("yielde
我知道函数的回调必须在某个地方注册,以便在yield语句之后继续执行,因此我将其添加到GLib mainloop中,以便使用
Idle.add
定期调用。这是我的伪代码:
async void loop_func()
{
var id = Idle.add(loop_func.callback);
message("Added idle %u",id);
yield;
message("yielded successfully 1");
yield;
message("yielded successfully 2");
for (var i = 0; i < 20; i++)
{
message("%d",i);
yield;
}
message("finished");
}
int main()
{
var loop = new GLib.MainLoop();
loop_func.begin(() => {loop.quit();});
loop.run();
return 0;
}
然后它就挂了。这里我遗漏了什么?尽管GLib反复调用空闲函数直到它告诉它停止(返回
false
),异步函数的.callback
似乎在被调用后立即停止重复
这可以通过每次在yield语句之前再次添加回调来克服:
async void loop_func()
{
for (var i = 0; i < 20; i++)
{
Idle.add(loop_func.callback);
yield;
}
}
async void loop_func()
{
对于(变量i=0;i<20;i++)
{
Idle.add(循环函数回调);
产量
}
}
另一种(可能更有效)方法是忽略异步函数回调返回的值:
async void loop_func()
{
var id = Idle.add(() => {loop_func.callback(); return Source.CONTINUE;});
for (var i = 0; i < 20; i++)
{
yield;
}
Source.remove(id);
}
async void loop_func()
{
var id=Idle.add(()=>{loop_func.callback();返回Source.CONTINUE;});
对于(变量i=0;i<20;i++)
{
产量
}
来源。删除(id);
}
尽管GLib反复调用空闲函数直到它告诉它停止(通过返回false
),异步函数的.callback
似乎在被调用后立即停止重复
这可以通过每次在yield语句之前再次添加回调来克服:
async void loop_func()
{
for (var i = 0; i < 20; i++)
{
Idle.add(loop_func.callback);
yield;
}
}
async void loop_func()
{
对于(变量i=0;i<20;i++)
{
Idle.add(循环函数回调);
产量
}
}
另一种(可能更有效)方法是忽略异步函数回调返回的值:
async void loop_func()
{
var id = Idle.add(() => {loop_func.callback(); return Source.CONTINUE;});
for (var i = 0; i < 20; i++)
{
yield;
}
Source.remove(id);
}
async void loop_func()
{
var id=Idle.add(()=>{loop_func.callback();返回Source.CONTINUE;});
对于(变量i=0;i<20;i++)
{
产量
}
来源。删除(id);
}
我不清楚当一个异步函数有多个产量时会发生什么代码>语句。您是从提供更多上下文的地方得到这个示例的吗?我想在for循环中执行一些昂贵的操作,但在每次迭代后将控制权交还给CPU,以阻止线程挂起。每次我在循环的一次迭代后让步时,我希望在CPU再次空闲时继续执行。我现在已经找到了这样做的方法;谢谢你的帮助!yield
的目的是安排一个异步回调,因此当耗时的操作在一个单独的函数中完成时,流返回到yield,GIO有很多异步函数,例如yield file.mount\u mountable(MountMountFlags.NONE)代码>是的,有很多异步函数的例子,其中有多个产生一些其他的异步函数()代码>但我找不到具有多个产量的代码>。我不清楚当一个异步函数有多个产量时会发生什么代码>语句。您是从提供更多上下文的地方得到这个示例的吗?我想在for循环中执行一些昂贵的操作,但在每次迭代后将控制权交还给CPU,以阻止线程挂起。每次我在循环的一次迭代后让步时,我希望在CPU再次空闲时继续执行。我现在已经找到了这样做的方法;谢谢你的帮助!yield
的目的是安排一个异步回调,因此当耗时的操作在一个单独的函数中完成时,流返回到yield,GIO有很多异步函数,例如yield file.mount\u mountable(MountMountFlags.NONE)代码>是的,有很多异步函数的例子,其中有多个产生一些其他的异步函数()代码>但我找不到具有多个产量的
MainLoop
是对GMainContext
的抽象,它是GLib的事件循环,可以为每个线程或多个线程创建,允许多个事件循环,如果您试图将流控制添加到耗时的操作中,但希望维护一个单独的响应线程,例如用于用户输入,然后可以查看灵感MainLoop
是对GMainContext
的抽象,它是GLib的事件循环,可以为每个线程或更多线程创建,允许多个事件循环,如果您试图将流控制添加到耗时的操作中,但希望维护一个单独的响应线程,例如,对于用户输入,则可以查看以获取灵感