1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>FreeMat: THREADVALUE Retrieve the return values from a thread</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">FreeMat
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.1.1 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('thread_threadvalue.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">THREADVALUE Retrieve the return values from a thread </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>Section: <a class="el" href="sec_thread.html">FreeMat Threads</a> </p>
<h1><a class="anchor" id="Usage"></a>
Usage</h1>
<p>The <code>threadvalue</code> function retrieves the values returned by the function specified in the <code>threadnew</code> call. The syntax for its use is </p>
<pre class="fragment"> [arg1,arg2,...,argN] = threadvalue(handle)
</pre><p> where <code>handle</code> is the value returned by a <code>threadnew</code> call. Note that there are issues with <code>nargout</code>. See the examples section of <code>threadnew</code> for details on how to work around this limitation. Because the function you have spawned with <code>threadnew</code> may still be executing, <code>threadvalue</code> must first <code>threadwait</code> for the function to complete before retrieving the output values. This wait may take an arbitrarily long time if the thread function is caught in an infinite loop. Hence, you can also specify a timeout parameter to <code>threadvalue</code> as </p>
<pre class="fragment"> [arg1,arg2,...,argN] = threadvalue(handle,timeout)
</pre><p> where the <code>timeout</code> is specified in milliseconds. If the wait times out, an error is raised (that can be caught with a <code>try</code> and <code>catch</code> block.</p>
<p>In either case, if the thread function itself caused an error and ceased execution abruptly, then calling <code>threadvalue</code> will cause that function to raise an error, allowing you to retrieve the error that was caused and correct it. See the examples section for more information. </p>
<h1><a class="anchor" id="Example"></a>
Example</h1>
<p>Here we do something very simple. We want to obtain a listing of all files on the system, but do not want the results to stop our computation. So we run the <code>system</code> call in a thread.</p>
<pre class="fragment">--> a = threadnew; % Create the thread
--> threadstart(a,'system',1,'ls -lrt /'); % Start the thread
--> b = rand(100)\rand(100,1); % Solve some equations simultaneously
--> c = threadvalue(a); % Retrieve the file list
--> size(c) % It is large!
ans =
1 28
--> threadfree(a);
</pre><p>In this example, we force the threaded function to cause an exception (by calling the <code>error</code> function as the thread function). When we call <code>threadvalue</code>, we get an error, instead of the return value of the function</p>
<pre class="fragment">--> a = threadnew
a =
3
--> threadstart(a,'error',0,'Hello world!'); % Will immediately stop due to error
--> c = threadvalue(a) % The error comes to us
Error: Thread: Hello world!
--> threadfree(a)
</pre><p>Note that the error has the text <code>Thread:</code> prepended to the message to help you identify that this was an error in a different thread. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="index.html">FreeMat Documentation</a></li><li class="navelem"><a class="el" href="sec_thread.html">FreeMat Threads</a></li>
<li class="footer">Generated on Thu Jul 25 2013 17:18:29 for FreeMat by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.1.1 </li>
</ul>
</div>
</body>
</html>
|