[gtkmm-documentation: 18/31] translate chapter 27.




commit 5a785b8b76756117d9714800cba3243c9d720b9a
Author: CCTV-1 <script tar gz gmail com>
Date:   Wed Jan 6 20:29:45 2021 +0800

    translate chapter 27.

 docs/tutorial/zh_CN/zh_CN.po | 109 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 104 insertions(+), 5 deletions(-)
---
diff --git a/docs/tutorial/zh_CN/zh_CN.po b/docs/tutorial/zh_CN/zh_CN.po
index e29dc29..d915f46 100644
--- a/docs/tutorial/zh_CN/zh_CN.po
+++ b/docs/tutorial/zh_CN/zh_CN.po
@@ -12127,11 +12127,11 @@ msgstr ""
 
 #: C/index-in.docbook:7033
 msgid "Multi-threaded programs"
-msgstr ""
+msgstr "多线程程序"
 
 #: C/index-in.docbook:7036
 msgid "The constraints"
-msgstr ""
+msgstr "约束条件"
 
 #: C/index-in.docbook:7047
 msgid ""
@@ -12151,6 +12151,17 @@ msgid ""
 "methodname> method or calls to any <classname>sigc::connection</classname> "
 "object relating to such a connection."
 msgstr ""
+"这些交互产生了以下事实:从<classname>sigc::trackable</classname>继承的类将从"
+"该继承获得一个<classname>std::list</classname>对象,该对象用于对调用"
+"<function>sigc::mem_fun()</function>所创建的槽(它表示任意非静态成员函数)进"
+"行跟踪(更特别的是它还保留了一个回调列表,在其被销毁时将已连接的槽置空)。每"
+"个<classname>sigc::slot</classname>通过<classname>sigc::slot_rep</classname>"
+"保留其自己的<classname>sigc::trackable</classname>对象,用以跟踪任何它需要通"
+"知其已消亡的<classname>sigc::connection</classname>对象,并且具有在任何"
+"<classname>sigc::trackable</classname>断开连接或销毁时注销自身的能力。"
+"<classname>sigc::signal</classname>对象还保留了槽列表,这个列表将通过调用它的"
+"<methodname>connect()</methodname>方法或任何与该连接有关的<classname>sigc::"
+"connection</classname>对象进行更新。"
 
 #: C/index-in.docbook:7038
 msgid ""
@@ -12162,10 +12173,14 @@ msgid ""
 "<application>libsigc++</application> are protected by a mutex or other means "
 "of synchronization. <_:footnote-1/>"
 msgstr ""
+"由于<application>libsigc++</application>(尤其是<classname>sigc::trackable</"
+"classname>)不是线程安全的,所以在编写基于<application>gtkmm</application>的"
+"多线程程序时需要格外小心。这是因为使用<application>libsigc++</application>时"
+"在幕后发生的复杂交互不受互斥量或其他同步方式的保护。"
 
 #: C/index-in.docbook:7071
 msgid "The rules"
-msgstr ""
+msgstr "规则"
 
 #: C/index-in.docbook:7073
 msgid ""
@@ -12175,6 +12190,9 @@ msgid ""
 "from <classname>sigc::trackable</classname>, because the effects are "
 "unintuitive (see particularly points 4 and 5 below)."
 msgstr ""
+"在使用<application>gtkmm</application>编写多线程程序时需要遵守许多规则。这些"
+"规则下下面列出,但要注意的一点是从<classname>sigc::trackable</classname>派生"
+"类时需要格外小心,因为效果很不直观(特别是下述4、5条)。"
 
 #: C/index-in.docbook:7084
 msgid ""
@@ -12182,6 +12200,8 @@ msgid ""
 "application> functions from worker threads (this is dealt with in more "
 "detail in the next section)."
 msgstr ""
+"使用<classname>Glib::Dispatcher</classname>在工作线程中调用"
+"<application>gtkmm</application>函数(这点将在下一节详细介绍)"
 
 #: C/index-in.docbook:7092
 msgid ""
@@ -12197,6 +12217,13 @@ msgid ""
 "referenced by slots connected to the signal object should only be destroyed "
 "in that thread."
 msgstr ""
+"<classname>sigc::signal</classname>对象被创建其的线程所拥有。只有该线程应该将"
+"<classname>sigc::slot</classname>对象连接到信号对象,并且只有该线程应该在"
+"<methodname>emit()</methodname>信号或在信号上调用<methodname>operator()()</"
+"methodname>或是将已连接的<classname>sigc::slot</classname>对象置空。因此任何"
+"由<application>gtkmm</application>部件提供的信号对象都只应该在主GUI线程进行操"
+"作,以及任何从<classname>sigc::trackable</classname>派生的对象(其非静态方法"
+"由连接到信号对象的槽引用)都应该在该线程中销毁。"
 
 #: C/index-in.docbook:7108
 msgid ""
@@ -12205,6 +12232,9 @@ msgid ""
 "connection</classname> object was called. Only that thread should call "
 "<classname>sigc::connection</classname> methods on the object."
 msgstr ""
+"任何<classname>sigc::connection</classname>对象都应视线程的拥有者在此线程调用"
+"了返回<classname>sigc::connection</classname>对象的方法。只有该线程才应在此对"
+"象上调用<classname>sigc::connection</classname>方法。"
 
 #: C/index-in.docbook:7118
 msgid ""
@@ -12214,6 +12244,9 @@ msgid ""
 "to another thread, nor destroyed by a different thread than the one which "
 "created it."
 msgstr ""
+"通过调用<function>sigc::mem_fun()</function>函数创建的<classname>sigc::slot</"
+"classname>对象具有由<classname>sigc::trackable</classname>所派生类的成员函数"
+"的引用,请勿将其复制到另一个线程中,也不要让除创建线程以外的线程销毁它。"
 
 #: C/index-in.docbook:7128
 msgid ""
@@ -12226,6 +12259,12 @@ msgid ""
 "using that function, or nulling those slots by disconnecting them or "
 "destroying the trackable object."
 msgstr ""
+"如果从<classname>sigc::trackable</classname>派生一个特定的类对象,只应有一个"
+"线程通过调用<function>sigc::mem_fun()</function>创建代表该类任意非静态成员函"
+"数的<classname>sigc::slot</classname>对象。第一个创建这样的槽的线程被视为拥有"
+"相关对象的线程。这个线程可以对该类的<emphasis>任意</emphasis>非静态成员函数使"
+"用该函数以创建槽,或者在<classname>sigc::trackable</classname>对象断开连接和"
+"被销毁时将那些槽无效化。"
 
 #: C/index-in.docbook:7142
 msgid ""
@@ -12238,6 +12277,13 @@ msgid ""
 "connect_seconds</methodname> for that main loop, or manipulate any "
 "<classname>sigc::connection</classname> object returned by them."
 msgstr ""
+"尽管<application>glib</application>自身是线程安全的,但是任何使用了"
+"<application>libsigc++</application>的<application>glibmm</application>封装都"
+"不会是线程安全的。因此只有在运行主循环的线程的主循环中才能调用"
+"<methodname>Glib::SignalIdle::connect()</methodname>、<methodname>Glib::"
+"SignalIO::connect()</methodname>、<methodname>Glib::SignalTimeout::"
+"connect()</methodname>、<methodname>Glib::SignalTimeout::connect_seconds</"
+"methodname>或是处理由它们返回的<classname>sigc::connection</classname>对象。"
 
 #: C/index-in.docbook:7154
 msgid ""
@@ -12248,10 +12294,16 @@ msgid ""
 "<function>sigc::mem_fun()</function> which represents a method of a class "
 "deriving from <classname>sigc::trackable</classname>."
 msgstr ""
+"对于<methodname>Glib::SignalIdle::connect_once()</methodname>、"
+"<methodname>Glib::SignalTimeout::connect_once()</methodname>、"
+"<methodname>Glib::SignalTimeout::connect_seconds_once()</methodname>等"
+"connect*_once()变体函数而言,只要它们使用的槽不是通过对<classname>sigc::"
+"trackable</classname>派生类的成员函数调用<function>sigc::mem_fun()</function>"
+"创建的,那么它们在任何情况下都是线程安全的。"
 
 #: C/index-in.docbook:7172
 msgid "Using Glib::Dispatcher"
-msgstr ""
+msgstr "使用<classname>Glib::Dispatcher</classname>"
 
 #: C/index-in.docbook:7174
 msgid ""
@@ -12266,6 +12318,13 @@ msgid ""
 "can emit on it and have the connected slots safely execute "
 "<application>gtkmm</application> functions."
 msgstr ""
+"连接到<classname>sigc::signal</classname>对象的槽将会在调用信号"
+"<methodname>emit()</methodname>、<methodname>operator()()</methodname>方法的"
+"线程被调用。而<classname>Glib::Dispatcher</classname>的行为与此相反:与其连接"
+"的槽将在构造<classname>Glib::Dispatcher</classname>对象的线程执行(该线程必须"
+"正在运行Glib主循环)。如果在GUI主线程上构造了<classname>Glib::Dispatcher</"
+"classname>,任何工作线程都可以在其上调用<methodname>emit()</methodname>并让槽"
+"安全的执行连接的<application>gtkmm</application>函数。"
 
 #: C/index-in.docbook:7188
 msgid ""
@@ -12286,6 +12345,17 @@ msgid ""
 "has started, additional synchronization will normally be required to ensure "
 "visibility)."
 msgstr ""
+"一些线程安全规则对于<classname>Glib::Dispatcher</classname>依旧适用。如前所"
+"述,必须在接收器线程(将在该线程的主循环中执行连接的槽)构造<classname>Glib::"
+"Dispatcher</classname>对象。默认情况下接收器线程应该是程序的主进程,尽管"
+"<classname>Glib::Dispatcher</classname>有一个可以接受<classname>Glib::"
+"MainContext</classname>对象为参数并且可以在任何运行Glib主循环的线程中调用的构"
+"造函数。只有接受者线程才应该在<classname>Glib::Dispatcher</classname>对象上调"
+"用<methodname>connect()</methodname>或操纵相关的<classname>sigc::connection</"
+"classname>对象,除非你为此提供了额外的同步措施。一旦接收器线程连接了槽,任何"
+"工作现场都可以不加锁直接在<classname>Glib::Dispatcher</classname>对象上调用"
+"<methodname>emit()</methodname>,但前提是该对象是在工作线程启动前构造的,如果"
+"不是则需要进行额外的同步以确保可见性。"
 
 #: C/index-in.docbook:7208
 msgid ""
@@ -12299,6 +12369,12 @@ msgid ""
 "relatively easy to write although there are subtleties in combining thread "
 "safety with strong exception safety)."
 msgstr ""
+"除了连接的槽在接收者线程执行以外,<classname>Glib::Dispatcher</classname>对象"
+"的行为与<classname>sigc::signal&lt;void()&gt;</classname>对象十分相似。因此它"
+"们不能传递未绑定的参数,也不能返回值。要传递未绑定参数最好的方法是使用线程安"
+"全的(同步)队列。尽管大多数编写多线程代码的人都会有一个可用的多线程代码,但"
+"是编写<application>glibmm</application>时没有(尽管线程安全与强异常安全结合有"
+"些微妙,但编写它们相对容易)。"
 
 #: C/index-in.docbook:7221
 msgid ""
@@ -12315,6 +12391,15 @@ msgid ""
 "emit, a normal <classname>sigc::signal&lt;void()&gt;</classname> object "
 "could of course be used instead."
 msgstr ""
+"接收者线程和工作线程都可以调用<classname>Glib::Dispatcher</classname>的"
+"<methodname>emit()</methodname>方法,虽然此操作需要在合理的范围内进行。在类"
+"Unix系统上<classname>Glib::Dispatcher</classname>共享同一个公共管道,从理论上"
+"讲在一个负载很大的系统上运行使用很大数量<classname>Dispatcher</classname>对象"
+"的程序至少可以填满系统。如果在接收者线程的主循环有机会读取并清空管道之前,管"
+"道已填满且接收器线程在此时尝试对<classname>Dispatcher</classname>调用"
+"<methodname>emit()</methodname>并因此对管道进行写入,这样会导致死锁。当然在接"
+"收者线程想要发出信号可以使用普通的<classname>sigc::signal&lt;void()&gt;</"
+"classname>对象。"
 
 #: C/index-in.docbook:7241
 msgid ""
@@ -12324,6 +12409,10 @@ msgid ""
 "It is deleted when the work is finished, when you press the <literal>Stop "
 "work</literal> button, or when you press the <literal>Quit</literal> button."
 msgstr ""
+"这是一个具有两个线程的示例程序,一个与所有<application>gtkmm</application>程"
+"序一样的GUI线程,和一个工作线程。当你按下<literal>Start work</literal>按钮时"
+"将创建工作线程,当工作完成或你按下<literal>Stop work</literal>按钮或是你按下"
+"<literal>Quit</literal>按钮时该线程将被删除。"
 
 #: C/index-in.docbook:7249
 msgid ""
@@ -12333,6 +12422,9 @@ msgid ""
 "is protected by a <classname>std::mutex</classname>. Only the GUI thread "
 "updates the GUI."
 msgstr ""
+"<classname>Glib::Dispatcher</classname>被用于工作线程向GUI线程发送通知。"
+"<classname>ExampleWorker</classname>包含两个线程都可以访问的数据。该数据被一"
+"个<classname>std::mutex</classname>保护。只有GUI线程对GUI进行更新。"
 
 #: C/index-in.docbook:7257
 msgid ""
@@ -12343,16 +12435,23 @@ msgid ""
 "handles the multi-threading complications for you, if you add "
 "<function>dependency('threads')</function>."
 msgstr ""
+"编译和链接多线程程序可能需要特殊的编译和链接参数。如果你使用<application>g+"
+"+</application>编译器你需要添加<literal>-pthread</literal>选项。其他编译器可"
+"能会要求使用其他选项。如果你使用<application>meson</application>构建程序,如"
+"果你在构建脚本中添加了<function>dependency('threads')</function>,它会帮你处"
+"理多线程的复杂性。"
 
 #: C/index-in.docbook:7266
 msgid "Multi-Threaded Program"
-msgstr ""
+msgstr "多线程程序"
 
 #: C/index-in.docbook:7272
 msgid ""
 "<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
 "examples/book/multithread\">Source Code</ulink>"
 msgstr ""
+"<ulink url=\"https://gitlab.gnome.org/GNOME/gtkmm-documentation/tree/master/";
+"examples/book/multithread\">源代码</ulink>"
 
 #: C/index-in.docbook:7279
 msgid "Recommended Techniques"


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]