Multithreading 使用GtkAda的Ada线程切换

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

我创建的任务似乎没有放弃控制权以便主线程运行。我不知道为什么。由于这是我第一次尝试在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_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()
任务执行该操作。我不