git-svn-id: svn://db.shs.com.ru/pip@501 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -26,7 +26,7 @@
|
||||
<tr style="height: 56px;">
|
||||
<td id="projectalign" style="padding-left: 0.5em;">
|
||||
<div id="projectname">PIP
|
||||
 <span id="projectnumber">0.7.1</span>
|
||||
 <span id="projectnumber">1.0.0_rc3</span>
|
||||
</div>
|
||||
<div id="projectbrief">Platform-Independent Primitives</div>
|
||||
</td>
|
||||
@@ -77,18 +77,20 @@ Inheritance diagram for PIThread:</div>
|
||||
<div class="dyncontent">
|
||||
<div class="center"><img src="class_p_i_thread__inherit__graph.png" border="0" usemap="#_p_i_thread_inherit__map" alt="Inheritance graph"/></div>
|
||||
<map name="_p_i_thread_inherit__map" id="_p_i_thread_inherit__map">
|
||||
<area shape="rect" id="node3" href="class_p_i_console.html" title="Console output class. " alt="" coords="187,155,281,181"/>
|
||||
<area shape="rect" id="node4" href="class_p_i_i_o_device.html" title="Base class for input/output classes. " alt="" coords="305,155,408,181"/>
|
||||
<area shape="rect" id="node11" href="class_p_i_kbd_listener.html" title="Keyboard console input listener. " alt="" coords="432,155,559,181"/>
|
||||
<area shape="rect" id="node12" href="class_p_i_process.html" title="PIProcess" alt="" coords="583,155,677,181"/>
|
||||
<area shape="rect" id="node13" href="class_p_i_screen.html" title="Console output class. " alt="" coords="701,155,788,181"/>
|
||||
<area shape="rect" id="node2" href="class_p_i_object.html" title="This is base class for any classes which use events -> handlers mechanism. " alt="" coords="452,5,539,32"/>
|
||||
<area shape="rect" id="node5" href="class_p_i_binary_log.html" title="Class for read and write binary data to logfile, and playback this data in realtime, or custom speed. " alt="" coords="5,229,116,256"/>
|
||||
<area shape="rect" id="node6" href="class_p_i_ethernet.html" title="Ethernet device. " alt="" coords="140,229,243,256"/>
|
||||
<area shape="rect" id="node7" href="class_p_i_file.html" title="Local file. " alt="" coords="267,229,337,256"/>
|
||||
<area shape="rect" id="node8" href="class_p_i_i_o_string.html" title="PIIODevice wrapper around PIString. " alt="" coords="361,229,464,256"/>
|
||||
<area shape="rect" id="node9" href="class_p_i_packet_extractor.html" title="Packets extractor. " alt="" coords="488,229,647,256"/>
|
||||
<area shape="rect" id="node10" href="class_p_i_serial.html" title="Serial device. " alt="" coords="671,229,757,256"/>
|
||||
<area shape="rect" id="node3" href="class_p_i_console.html" title="Console output class. " alt="" coords="291,157,385,184"/>
|
||||
<area shape="rect" id="node4" href="class_p_i_i_o_device.html" title="Base class for input/output classes. " alt="" coords="287,208,389,235"/>
|
||||
<area shape="rect" id="node14" href="class_p_i_kbd_listener.html" title="Keyboard console input listener. " alt="" coords="275,259,401,285"/>
|
||||
<area shape="rect" id="node15" href="class_p_i_process.html" title="PIProcess" alt="" coords="291,309,385,336"/>
|
||||
<area shape="rect" id="node2" href="class_p_i_object.html" title="This is base class for any classes which use events -> handlers mechanism. " alt="" coords="5,233,92,260"/>
|
||||
<area shape="rect" id="node5" href="class_p_i_binary_log.html" title="Class for read and write binary data to logfile, and playback this data in realtime, or custom speed. " alt="" coords="481,5,592,32"/>
|
||||
<area shape="rect" id="node6" href="class_p_i_ethernet.html" title="Ethernet device. " alt="" coords="485,56,588,83"/>
|
||||
<area shape="rect" id="node7" href="class_p_i_file.html" title="Local file. " alt="" coords="501,107,572,133"/>
|
||||
<area shape="rect" id="node8" href="class_p_i_i_o_byte_array.html" title="PIIODevice wrapper around PIByteArray. " alt="" coords="473,157,600,184"/>
|
||||
<area shape="rect" id="node9" href="class_p_i_i_o_string.html" title="PIIODevice wrapper around PIString. " alt="" coords="485,208,588,235"/>
|
||||
<area shape="rect" id="node10" href="class_p_i_packet_extractor.html" title="Packets extractor. " alt="" coords="457,259,616,285"/>
|
||||
<area shape="rect" id="node11" href="class_p_i_serial.html" title="Serial device. " alt="" coords="493,309,580,336"/>
|
||||
<area shape="rect" id="node12" href="class_p_i_shared_memory.html" title="Shared memory. " alt="" coords="469,360,604,387"/>
|
||||
<area shape="rect" id="node13" href="class_p_i_transparent_device.html" title="PIIODevice that pass write to read. " alt="" coords="449,411,624,437"/>
|
||||
</map>
|
||||
<center><span class="legend">[<a target="top" href="graph_legend.html">legend</a>]</span></center></div>
|
||||
<table class="memberdecls">
|
||||
@@ -165,10 +167,10 @@ llong </td><td class="memItemRight" valign="bottom"><a class="el" href="cla
|
||||
virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#ac50df87aa63e061abd460f9a71e7176a">className</a> () const</td></tr>
|
||||
<tr class="memdesc:ac50df87aa63e061abd460f9a71e7176a inherit pub_methods_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">Returns object class name. <br /></td></tr>
|
||||
<tr class="separator:ac50df87aa63e061abd460f9a71e7176a inherit pub_methods_class_p_i_object"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a2be2cb734c68719bb3c95613f7a7f55a inherit pub_methods_class_p_i_object"><td class="memItemLeft" align="right" valign="top"><a id="a2be2cb734c68719bb3c95613f7a7f55a"></a>
|
||||
virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#a2be2cb734c68719bb3c95613f7a7f55a">superClassName</a> () const</td></tr>
|
||||
<tr class="memdesc:a2be2cb734c68719bb3c95613f7a7f55a inherit pub_methods_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">Returns object superclass name. <br /></td></tr>
|
||||
<tr class="separator:a2be2cb734c68719bb3c95613f7a7f55a inherit pub_methods_class_p_i_object"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a281e02fd3810ec632c5db2e2460aa85c inherit pub_methods_class_p_i_object"><td class="memItemLeft" align="right" valign="top"><a id="a281e02fd3810ec632c5db2e2460aa85c"></a>
|
||||
virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#a281e02fd3810ec632c5db2e2460aa85c">parentClassName</a> () const</td></tr>
|
||||
<tr class="memdesc:a281e02fd3810ec632c5db2e2460aa85c inherit pub_methods_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">Returns parent object class name. <br /></td></tr>
|
||||
<tr class="separator:a281e02fd3810ec632c5db2e2460aa85c inherit pub_methods_class_p_i_object"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a8df5efbe08b98034b5ebadad11a2e94e inherit pub_methods_class_p_i_object"><td class="memItemLeft" align="right" valign="top"><a id="a8df5efbe08b98034b5ebadad11a2e94e"></a>
|
||||
bool </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#a8df5efbe08b98034b5ebadad11a2e94e">debug</a> () const</td></tr>
|
||||
<tr class="memdesc:a8df5efbe08b98034b5ebadad11a2e94e inherit pub_methods_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">Return if debug of this object is active. <br /></td></tr>
|
||||
@@ -234,9 +236,6 @@ Handlers</h2></td></tr>
|
||||
<tr class="memitem:a5fb7161b42840be7fb2f738046887b39"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_thread.html#a5fb7161b42840be7fb2f738046887b39">start</a> (int timer_delay)</td></tr>
|
||||
<tr class="memdesc:a5fb7161b42840be7fb2f738046887b39"><td class="mdescLeft"> </td><td class="mdescRight">Start thread. <a href="#a5fb7161b42840be7fb2f738046887b39">More...</a><br /></td></tr>
|
||||
<tr class="separator:a5fb7161b42840be7fb2f738046887b39"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a38785bbce4ef9afb7116cea78beffa08"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_thread.html#a38785bbce4ef9afb7116cea78beffa08">start</a> (ThreadFunc func, int timer_delay)</td></tr>
|
||||
<tr class="memdesc:a38785bbce4ef9afb7116cea78beffa08"><td class="mdescLeft"> </td><td class="mdescRight">Start thread. <a href="#a38785bbce4ef9afb7116cea78beffa08">More...</a><br /></td></tr>
|
||||
<tr class="separator:a38785bbce4ef9afb7116cea78beffa08"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a44a9fe015ea8288a0a336b614ff2962b"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_thread.html#a44a9fe015ea8288a0a336b614ff2962b">startOnce</a> ()</td></tr>
|
||||
<tr class="memdesc:a44a9fe015ea8288a0a336b614ff2962b"><td class="mdescLeft"> </td><td class="mdescRight">Start thread without internal loop. <a href="#a44a9fe015ea8288a0a336b614ff2962b">More...</a><br /></td></tr>
|
||||
<tr class="separator:a44a9fe015ea8288a0a336b614ff2962b"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
@@ -301,7 +300,7 @@ static <a class="el" href="class_p_i_object.html">PIObject</a> * </td><td c
|
||||
<tr class="separator:affa62b02040517a34b3f173d804e487f inherit related_class_p_i_object"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a8cd6444e57a0f7f25888c8b8293d3543 inherit related_class_p_i_object"><td class="memItemLeft" align="right" valign="top"><a id="a8cd6444e57a0f7f25888c8b8293d3543"></a>
|
||||
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#a8cd6444e57a0f7f25888c8b8293d3543">PIOBJECT_SUBCLASS</a>(<a class="el" href="class_p_i_object.html#a5c3600479f3e919bbd4f905b7fedc275">name</a>, parent)</td></tr>
|
||||
<tr class="memdesc:a8cd6444e57a0f7f25888c8b8293d3543 inherit related_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">you should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class <br /></td></tr>
|
||||
<tr class="memdesc:a8cd6444e57a0f7f25888c8b8293d3543 inherit related_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">you should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class, and <em>scopeList()</em> <br /></td></tr>
|
||||
<tr class="separator:a8cd6444e57a0f7f25888c8b8293d3543 inherit related_class_p_i_object"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:ab605cf0454d34cc72c65bfed2abd696a inherit related_class_p_i_object"><td class="memItemLeft" align="right" valign="top"><a id="ab605cf0454d34cc72c65bfed2abd696a"></a>
|
||||
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#ab605cf0454d34cc72c65bfed2abd696a">EVENT_HANDLER0</a>(ret, <a class="el" href="class_p_i_object.html#a5c3600479f3e919bbd4f905b7fedc275">name</a>)   ret <a class="el" href="class_p_i_object.html#a5c3600479f3e919bbd4f905b7fedc275">name</a>()</td></tr>
|
||||
@@ -379,6 +378,10 @@ static <a class="el" href="class_p_i_object.html">PIObject</a> * </td><td c
|
||||
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#ac86f9567fcbe10d7e49685e0a01b8427">CONNECTU</a>(src, event, dest, handler)</td></tr>
|
||||
<tr class="memdesc:ac86f9567fcbe10d7e49685e0a01b8427 inherit related_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">connect event "event" from object "src" to event handler "handler". "Event" and "handler" must has equal argument lists. <br /></td></tr>
|
||||
<tr class="separator:ac86f9567fcbe10d7e49685e0a01b8427 inherit related_class_p_i_object"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a36eb41db41fc261cf97260d1dbe76867 inherit related_class_p_i_object"><td class="memItemLeft" align="right" valign="top"><a id="a36eb41db41fc261cf97260d1dbe76867"></a>
|
||||
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#a36eb41db41fc261cf97260d1dbe76867">CONNECTU_QUEUED</a>(src, event, dest, handler, performer)</td></tr>
|
||||
<tr class="memdesc:a36eb41db41fc261cf97260d1dbe76867 inherit related_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">connect event "event" from object "src" to event handler "handler". Event handler will be executed by "performer". "Event" and "handler" must has equal argument lists. <br /></td></tr>
|
||||
<tr class="separator:a36eb41db41fc261cf97260d1dbe76867 inherit related_class_p_i_object"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a38e74a7ce99df00a10517f5ce4aa66c5 inherit related_class_p_i_object"><td class="memItemLeft" align="right" valign="top"><a id="a38e74a7ce99df00a10517f5ce4aa66c5"></a>
|
||||
#define </td><td class="memItemRight" valign="bottom"><a class="el" href="class_p_i_object.html#a38e74a7ce99df00a10517f5ce4aa66c5">CONNECT0</a>(ret, src, event, dest, handler)</td></tr>
|
||||
<tr class="memdesc:a38e74a7ce99df00a10517f5ce4aa66c5 inherit related_class_p_i_object"><td class="mdescLeft"> </td><td class="mdescRight">connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists <br /></td></tr>
|
||||
@@ -465,7 +468,7 @@ Synopsis</h1>
|
||||
<p>This class provide virtual functions <em><a class="el" href="class_p_i_thread.html#a70d5c858e8b7144280b8b216304ce1d0" title="Function executed once at the start of thread. ">begin()</a></em>, <em><a class="el" href="class_p_i_thread.html#a8c9cacfd381e0e02eb6e52810d48ce2e" title="Function executed at every "timer_delay" msecs until thread was stopped. ">run()</a></em> and <em><a class="el" href="class_p_i_thread.html#af6dacd35973ff834f007d0f6a40f6e9c" title="Function executed once at the end of thread. ">end()</a></em>, which describes start, execution and finish work of some process. These functions executes in <b>separate</b> thread. When you execute <em>start()</em>, PIThread create separate system thread and sequentially executes function <em><a class="el" href="class_p_i_thread.html#a70d5c858e8b7144280b8b216304ce1d0" title="Function executed once at the start of thread. ">begin()</a></em>, <em><a class="el" href="class_p_i_thread.html#a8c9cacfd381e0e02eb6e52810d48ce2e" title="Function executed at every "timer_delay" msecs until thread was stopped. ">run()</a></em> and <em><a class="el" href="class_p_i_thread.html#af6dacd35973ff834f007d0f6a40f6e9c" title="Function executed once at the end of thread. ">end()</a></em>. You can reimplement each function and write your own code to execute. Scheme of functions executing: </p><div class="fragment"><div class="line"><a class="code" href="class_p_i_thread.html#a70d5c858e8b7144280b8b216304ce1d0">begin</a>();</div><div class="line"><span class="keyword">event</span> <a class="code" href="class_p_i_thread.html#a6b91eb8632e75e0f00a625f28a0bedd1">started</a>();</div><div class="line"><span class="keywordflow">while</span> (<a class="code" href="class_p_i_thread.html#a2281bcd181604a34fa3e5d1c9ac4edef">isRunning</a>()) {</div><div class="line"> <a class="code" href="class_p_i_thread.html#a8c9cacfd381e0e02eb6e52810d48ce2e">run</a>();</div><div class="line"> ThreadFunc();</div><div class="line"> <a class="code" href="pitime_8h.html#a242b1482cf8e5f7a8c5d087a2d2b5e3b">msleep</a>(timer_delay);</div><div class="line">}</div><div class="line"><span class="keyword">event</span> <a class="code" href="class_p_i_thread.html#aa6350430814f777fdce81f99cbba4c1a">stopped</a>();</div><div class="line"><a class="code" href="class_p_i_thread.html#af6dacd35973ff834f007d0f6a40f6e9c">end</a>();</div></div><!-- fragment --><p> Unlike from directly using "pthread" or some similar you doesn`t need to write your own main thread cycle and sleep at every cycle end. PIThread make it for you, and your job is to set sleep value from contructor or when starting thread, and reimplement <em><a class="el" href="class_p_i_thread.html#a70d5c858e8b7144280b8b216304ce1d0" title="Function executed once at the start of thread. ">begin()</a></em>, <em><a class="el" href="class_p_i_thread.html#a8c9cacfd381e0e02eb6e52810d48ce2e" title="Function executed at every "timer_delay" msecs until thread was stopped. ">run()</a></em> and <em><a class="el" href="class_p_i_thread.html#af6dacd35973ff834f007d0f6a40f6e9c" title="Function executed once at the end of thread. ">end()</a></em> functions.</p>
|
||||
<h1><a class="anchor" id="PIThread_sec1"></a>
|
||||
Using without subclassing</h1>
|
||||
<p>You can use PIThread without subclassing by using "ThreadFunc" pointer that can be set from constructor or by overloaded function <em><a class="el" href="class_p_i_thread.html#a38785bbce4ef9afb7116cea78beffa08" title="Start thread. ">start(ThreadFunc func, int timer_delay)</a></em>. If "func" if not null this function will be executed as <em><a class="el" href="class_p_i_thread.html#a8c9cacfd381e0e02eb6e52810d48ce2e" title="Function executed at every "timer_delay" msecs until thread was stopped. ">run()</a></em>. ThreadFunc is any static function with format void func(void * data). "Data" is custom data set from constructor or with function <em><a class="el" href="class_p_i_thread.html#a221e15d1a4093b7db6cc579fc8be69b6" title="Set common data passed to external function. ">setData()</a></em>. <br />
|
||||
<p>You can use PIThread without subclassing by using "ThreadFunc" pointer that can be set from constructor or by overloaded function <em>start(ThreadFunc func, int timer_delay)</em>. If "func" if not null this function will be executed as <em><a class="el" href="class_p_i_thread.html#a8c9cacfd381e0e02eb6e52810d48ce2e" title="Function executed at every "timer_delay" msecs until thread was stopped. ">run()</a></em>. ThreadFunc is any static function with format void func(void * data). "Data" is custom data set from constructor or with function <em><a class="el" href="class_p_i_thread.html#a221e15d1a4093b7db6cc579fc8be69b6" title="Set common data passed to external function. ">setData()</a></em>. <br />
|
||||
Also you can connect to event <em><a class="el" href="class_p_i_thread.html#a6b91eb8632e75e0f00a625f28a0bedd1" title="Raise on thread start. ">started()</a></em>, but in this case you should to white your thread main cycle, because this event raised only one time.</p>
|
||||
<h1><a class="anchor" id="PIThread_sec2"></a>
|
||||
Locking</h1>
|
||||
@@ -501,7 +504,7 @@ Locking</h1>
|
||||
</div>
|
||||
<h2 class="groupheader">Member Function Documentation</h2>
|
||||
<a id="a5fb7161b42840be7fb2f738046887b39"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#a5fb7161b42840be7fb2f738046887b39">◆ </a></span>start() <span class="overload">[1/2]</span></h2>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#a5fb7161b42840be7fb2f738046887b39">◆ </a></span>start()</h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
@@ -520,46 +523,6 @@ Locking</h1>
|
||||
<p>Start execution of <em><a class="el" href="class_p_i_thread.html#a8c9cacfd381e0e02eb6e52810d48ce2e" title="Function executed at every "timer_delay" msecs until thread was stopped. ">run()</a></em> in internal loop with "timer_delay" delay in milliseconds. If "timer_delay" <= 0 there is no delay in loop. Thread also exec external function set by <em><a class="el" href="class_p_i_thread.html#a85c22bf31dae02180827f2952e3594ee" title="Set external function that will be executed after every run() ">setSlot()</a></em> if it`s not null</p>
|
||||
<dl class="section return"><dt>Returns</dt><dd><code>false</code> if thread already started or can`t start thread </dd></dl>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<a id="a38785bbce4ef9afb7116cea78beffa08"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#a38785bbce4ef9afb7116cea78beffa08">◆ </a></span>start() <span class="overload">[2/2]</span></h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
<table class="mlabels">
|
||||
<tr>
|
||||
<td class="mlabels-left">
|
||||
<table class="memname">
|
||||
<tr>
|
||||
<td class="memname">bool PIThread::start </td>
|
||||
<td>(</td>
|
||||
<td class="paramtype">ThreadFunc </td>
|
||||
<td class="paramname"><em>func</em>, </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="paramkey"></td>
|
||||
<td></td>
|
||||
<td class="paramtype">int </td>
|
||||
<td class="paramname"><em>timer_delay</em> = <code>-1</code> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>)</td>
|
||||
<td></td><td></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td class="mlabels-right">
|
||||
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
|
||||
<p>Start thread. </p>
|
||||
<p>Overloaded function. Set external function "func" before start</p>
|
||||
<dl class="section return"><dt>Returns</dt><dd><code>false</code> if thread already started or can`t start thread </dd></dl>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<a id="a44a9fe015ea8288a0a336b614ff2962b"></a>
|
||||
@@ -712,7 +675,7 @@ Locking</h1>
|
||||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||||
<ul>
|
||||
<li class="navelem"><a class="el" href="class_p_i_thread.html">PIThread</a></li>
|
||||
<li class="footer">Generated on Mon Feb 27 2017 15:24:46 for PIP by
|
||||
<li class="footer">Generated on Tue May 23 2017 11:20:44 for PIP by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
|
||||
</ul>
|
||||
|
||||
Reference in New Issue
Block a user