Multithreading 使用GtkAda的Ada线程切换
我创建的任务似乎没有放弃控制权以便主线程运行。我不知道为什么。由于这是我第一次尝试在Ada中使用多线程(在GNAT和GtkAda下),我确信我在这里遗漏了一些基本原则 我的主要观点如下:Multithreading 使用GtkAda的Ada线程切换,multithreading,gtk,ada,Multithreading,Gtk,Ada,我创建的任务似乎没有放弃控制权以便主线程运行。我不知道为什么。由于这是我第一次尝试在Ada中使用多线程(在GNAT和GtkAda下),我确信我在这里遗漏了一些基本原则 我的主要观点如下: procedure Main is begin Test_Gui.Gui_Task.Gui_Initialize; Test_Gui.Simple_Switch_Test; Msg("Done"); end; task type Gui_Type is entry Gui_Initial
procedure Main is
begin
Test_Gui.Gui_Task.Gui_Initialize;
Test_Gui.Simple_Switch_Test;
Msg("Done");
end;
task type Gui_Type is
entry Gui_Initialize;
entry Gui_Reset_SwitCh_To_1;
entry Gui_Display_Message(Message : String);
entry Gui_Write_Debug;
end Gui_Type;
Gui_Task : Gui_Type;
在package Test_Gui中,规范和主体代码如下所示:
procedure Main is
begin
Test_Gui.Gui_Task.Gui_Initialize;
Test_Gui.Simple_Switch_Test;
Msg("Done");
end;
task type Gui_Type is
entry Gui_Initialize;
entry Gui_Reset_SwitCh_To_1;
entry Gui_Display_Message(Message : String);
entry Gui_Write_Debug;
end Gui_Type;
Gui_Task : Gui_Type;
及
从main调用的第二种方法是Simple_Switch_Test,它从Redisplay_Item_和_Get_开关中调用GUI任务
procedure Simple_Switch_Test is
Text : String(1..80) := (others => ' ');
Msg : String(1..16);
begin
loop
Count := Count + 1;
Copy_String(Integer'Image(Count), Text);
for I in 1..16 loop
Msg(I) := Text(I);
end loop;
Redisplay_Item_And_Get_Switches(Msg);
Copy_String("some stuff.."), Debug_Label_Text );
Gui_Task.Gui_Write_Debug;
delay 0.01;
end loop;
end;
初始化工作正常,GUI功能正常,即使回调也正常。但是,在从Simple_Switch_测试中第一次调用Redisplay_Item_和_Get_Switches将代码放入GUI任务循环之后,除了处理回调之外,它从未离开else子句
因此,它永远不会调用Gui_Task.Gui_Write_Debug并在主任务中继续该代码
我已经在调试器中验证了这一点
我原以为每个循环中的延迟都会暂停相关的任务,但我显然没有正确地理解它。这段代码不需要太多更改就可以修复吗?(我希望我正确地实现了任务的基本框架。)它缺少什么或有什么错?我看到的问题是,Gtkada是在不支持Ada任务模型的非Ada产品Gtk之上分层的 根据: 已知GTK+不安全。特别是,所有调用都需要来自同一个任务(线程) 我没有更好的建议,就是在这个链接上阅读他的文档,特别是第一节“1.GTK+任务”,其中包含第1.1节中的一个示例,如果您觉得有帮助,请下载并使用他的支持库
(如果人们认为这应该是一个评论,我会这么说)我看到的问题是,Gtkada是在不支持Ada任务模型的非Ada产品Gtk之上分层的 根据: 已知GTK+不安全。特别是,所有调用都需要来自同一个任务(线程) 我没有更好的建议,就是在这个链接上阅读他的文档,特别是第一节“1.GTK+任务”,其中包含第1.1节中的一个示例,如果您觉得有帮助,请下载并使用他的支持库
(如果人们认为这应该是一个评论,我会这么说)我看到的问题是,Gtkada是在不支持Ada任务模型的非Ada产品Gtk之上分层的 根据: 已知GTK+不安全。特别是,所有调用都需要来自同一个任务(线程) 我没有更好的建议,就是在这个链接上阅读他的文档,特别是第一节“1.GTK+任务”,其中包含第1.1节中的一个示例,如果您觉得有帮助,请下载并使用他的支持库
(如果人们认为这应该是一个评论,我会这么说)我看到的问题是,Gtkada是在不支持Ada任务模型的非Ada产品Gtk之上分层的 根据: 已知GTK+不安全。特别是,所有调用都需要来自同一个任务(线程) 我没有更好的建议,就是在这个链接上阅读他的文档,特别是第一节“1.GTK+任务”,其中包含第1.1节中的一个示例,如果您觉得有帮助,请下载并使用他的支持库
(如果人们认为这应该是一个评论,我会这么说)我还没有对这种设计(在Go中,不是Ada,而是相同的原理/技术)进行足够的实验,以了解为什么代码不起作用,或者为什么延迟不起作用。我会说你要做的是把它分成两个任务。只需调用
gtk_main()
即可处理那里的所有GUI内容。另一个拥有所有的Gui\u Do\u Thing
功能,使用g\u idle\u add()
或gdk\u threads\u add\u idle()
函数(两个函数中的一个)告诉gtk\u main()
任务执行该操作。对不起,我不知道Ada等价物是什么,也不知道如何编写它们。祝你好运我还没有对这种设计进行足够的实验(在Go中,不是Ada,而是相同的原理/技术),以了解为什么代码不起作用,或者为什么延迟不起作用。我会说你要做的是把它分成两个任务。只需调用gtk_main()
即可处理那里的所有GUI内容。另一个拥有所有的Gui\u Do\u Thing
功能,使用g\u idle\u add()
或gdk\u threads\u add\u idle()
函数(两个函数中的一个)告诉gtk\u main()
任务执行该操作。对不起,我不知道Ada等价物是什么,也不知道如何编写它们。祝你好运我还没有对这种设计进行足够的实验(在Go中,不是Ada,而是相同的原理/技术),以了解为什么代码不起作用,或者为什么延迟不起作用。我会说你要做的是把它分成两个任务。只需调用gtk_main()
即可处理那里的所有GUI内容。另一个拥有所有的Gui\u Do\u Thing
功能,使用g\u idle\u add()
或gdk\u threads\u add\u idle()
函数(两个函数中的一个)告诉gtk\u main()
任务执行该操作。对不起,我不知道Ada等价物是什么,也不知道如何编写它们。祝你好运我还没有对这种设计进行足够的实验(在Go中,不是Ada,而是相同的原理/技术),以了解为什么代码不起作用,或者为什么延迟不起作用。我会说你要做的是把它分成两个任务。只需调用gtk_main()
即可处理那里的所有GUI内容。另一个拥有所有的Gui\u Do\u Thing
功能,使用g\u idle\u add()
或gdk\u threads\u add\u idle()
函数(两个函数中的一个)告诉gtk\u main()
任务执行该操作。我不