tag:blogger.com,1999:blog-1746081986224402432024-03-05T01:24:30.597-08:00Thefull World! Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.comBlogger114125tag:blogger.com,1999:blog-174608198622440243.post-27322111132225362472017-08-23T07:43:00.003-07:002017-08-23T07:45:55.538-07:00Android y Git. Disponer del hash automáticamente.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGHEkNxar8tCC7yfl_SHTb51Ts7D72IQnBKj9AnLF6yusIrVP4d0R1Xx5VTMN2We93LF_wgseefDoeuckT20Zhspwh9FZNk9xxrb4G8p8r1MKtEnaQJGOyCGy8rVlRGIRVXO85Z04YJzZu/s1600/GitwithAndroidStudio.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="310" data-original-width="500" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGHEkNxar8tCC7yfl_SHTb51Ts7D72IQnBKj9AnLF6yusIrVP4d0R1Xx5VTMN2We93LF_wgseefDoeuckT20Zhspwh9FZNk9xxrb4G8p8r1MKtEnaQJGOyCGy8rVlRGIRVXO85Z04YJzZu/s320/GitwithAndroidStudio.jpg" width="320" /></a></div>
<br />
<span style="font-family: Arial, Helvetica, sans-serif;">Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usando, para poder rápidamente identificar esa aplicación en </span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">que parte se encuentra dentro de mi historia.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">Mucha gente hace una variable , ya sea de fecha de compilacion, hora, etc, o var = "1.0.a".</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">Pero la idea es que sea el propio entorno el que lo haga por nosotros.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">Para dotar a Android Studio de ello, a través de gradle, tan simple como editar el fichero </span><br />
<b><span style="font-family: Arial, Helvetica, sans-serif;">build.gradle</span></b><br />
<br />
<pre><span style="font-family: Courier New; font-size: x-small;">
apply plugin: 'com.android.application'
android {
<span style="background-color: #b4a7d6;"> def getGitHash = { ->
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = stdout
}
return stdout.toString().trim()
}</span>
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
applicationId 'com.app.com.test'
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
<span style="background-color: #b4a7d6;">buildConfigField "String", "GitHash", "\"${getGitHash()}\""</span>
}</span></pre>
<pre><span style="font-family: Courier New; font-size: x-small;">
</span></pre>
<span style="font-family: Arial, Helvetica, sans-serif;">Lo marcado en color es lo que tenéis que poner en el fichero build.gradle.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">OJO , la función getGitHash() DEBE de estar ARRIBA, de lo contrario, no la encontrará.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">Después , para usarla desde nuestro código;</span><br />
<pre><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: white;">String hash = BuildConfig.</span><span style="background-color: white; color: #660e7a; font-weight: bold;">GitHash;</span></span></pre>
<pre style="font-family: "Courier New";">
</pre>
<br />Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-62510670024894154092017-08-19T14:42:00.000-07:002017-08-19T14:42:19.130-07:00KOTLIN. Property , esa cosa que no es un field.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1shb_GXLsSPyfSW7cEPg-7zZIQmS9_hhJh4GpMcJuwdgMNSU9vGI80RzhVA-_GwmZZRmwhv1NU0RZUaTgRZsYL_HnPSVa7y-QGWLPsUxeO0yRNWWmVGHWf3qZ58ZikePgdoCmjVMeCQ3W/s1600/kotlin2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="128" data-original-width="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1shb_GXLsSPyfSW7cEPg-7zZIQmS9_hhJh4GpMcJuwdgMNSU9vGI80RzhVA-_GwmZZRmwhv1NU0RZUaTgRZsYL_HnPSVa7y-QGWLPsUxeO0yRNWWmVGHWf3qZ58ZikePgdoCmjVMeCQ3W/s1600/kotlin2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: large;"><br /></span>
<div style="text-align: center;">
<span style="font-family: "arial" , "helvetica" , sans-serif; font-size: large;">KOTLIN. Property , esa cosa que no es un field.</span></div>
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Haciendo una pausa en la documentación, me pongo a experimental el crear / pasar mis clases de cálculos mecánicos desde Java a Kotlin, y me encuentro que estoy encallado a las primeras de cambio.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Para ello voy a poner la clase muy simplificada en Java , su conversión a Kotlin , y una breve explicación del problema encontrado;</span><br />
<span style="font-size: x-small;"><br /></span>
<i><b><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">Platform declaration clash: The following declarations have the same JVM signature (getDiametroExterior()D):</span></b></i><br />
<i><b><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">public final fun <get-diametroExterior>(): Double</span></b></i><br />
<i><b><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">public final fun getDiametroExterior(): Double</span></b></i><br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">La clase en Java ;</span><br />
<span style="font-family: arial, helvetica, sans-serif;"><br /></span>
<span style="color: white;"><br /></span>
<pre style="background-color: #2b2b2b;"><div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;">public class Pieza {</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> private double diametroExterior;</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;">
</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> public Pieza(){</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> reset();</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> }</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;">
</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> public void reset(){</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> setDiametroExterior(0); </span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> }</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;">
</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> public double getDiametroExterior() {</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> return diametroExterior; }</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;">
</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> public void setDiametroExterior(double diametroExterior) {</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> this.diametroExterior = diametroExterior;</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;"> }</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: "arial" , "helvetica" , sans-serif;"></span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: arial, helvetica, sans-serif;">}</span></div>
</pre>
<div>
<span style="color: #cc7832; font-family: source code pro;"><br /></span></div>
<span style="font-family: arial, helvetica, sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Podemos observa que tenemos un <b>field, </b>llamado<b> diametroExterior, </b>y sus getters/setters correspondientes.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Si intentamos convertir esto tal cual a Kotlin, con mentalidad "Javato" ;-)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<pre style="background-color: #2b2b2b;"><span style="color: white; font-family: Arial, Helvetica, sans-serif;">open class PiezaK {
init {
reset()
}
var diametroExterior: Double = 0.0
fun reset() {
setDiametroExterior(0.0)
}
fun getDiametroExterior(): Double {
return diametroExterior
}
fun setDiametroExterior(diametroExterior: Double) {
this.diametroExterior = diametroExterior
}
}</span></pre>
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Es en este caso cuando nos dará el mensaje <i><b> "...The following declarations have the same JVM signature..."</b></i></span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">¿ Pero donde está el problema ? </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Bueno, una manera rápida de solucionarlo sería hacer lo siguiente, declarar la variable como </span><b style="font-family: Arial, Helvetica, sans-serif;">private. </b><span style="font-family: "arial" , "helvetica" , sans-serif;">De esta manera solucionamos la conversión de Java a Kotlin. </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">¿ Es correcto ? NO. ¿ Funciona ? SI, ¿ Entonces donde radica el problema ?</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">El problema es entender que en Kotlin <b>NO EXISTE</b> los fields de Java.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Esta declaración de Java <i>private double diametroExterior</i><b> no equivale a </b><span style="color: #cc7832;"> </span><span style="font-style: italic;">var </span><i>diametroExterior: Double </i>en Kotlin</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">En Java es un <b>field</b>, en Kotlin es una <b>property</b>, </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">¿ Y que hace Kotlin automáticamente por nosotros ? </span><span style="font-family: "arial" , "helvetica" , sans-serif;">Si, los getters/setters.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Por eso, cuando es <b>private</b> funciona para acceder a esa propiedad, pero cuando se indica que es public </span><span style="font-family: "arial" , "helvetica" , sans-serif;">estamos reescribiendo las funciones que Kotlin hace por nosotros.</span><br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Por lo tanto, la transformación correcta sería;</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"></span><br />
<pre style="background-color: #2b2b2b;"><div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif;">open class PiezaK {</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif;"> init {</span><span style="color: white; font-family: Arial, Helvetica, sans-serif;"> reset()</span><span style="color: white; font-family: Arial, Helvetica, sans-serif;"> }</span><span style="color: white; font-family: Arial, Helvetica, sans-serif;">
</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif;"> var diametroExterior: Double = 0.0</span><span style="color: white; font-family: Arial, Helvetica, sans-serif;"> </span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif;"> fun reset() {</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif;"> diametroExterior = 0</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif;"> }</span></div>
<div style="font-family: "Times New Roman"; white-space: normal;">
<span style="color: white; font-family: Arial, Helvetica, sans-serif;">}</span></div>
</pre>
<div>
<span style="color: white; font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Es decir, cuando se declara una <b>property, </b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<i><span style="font-family: "courier new" , "courier" , monospace;">var name = "PEPE"</span></i><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
realmente ocurre lo siguiente, el equivalente de esto en Java ;<br />
<i><span style="font-family: "courier new" , "courier" , monospace;"><br /></span></i>
<i><span style="font-family: "courier new" , "courier" , monospace;">private String _name = "PEPE";</span></i><br />
<i><span style="font-family: "courier new" , "courier" , monospace;">public String getName() { return _name ; }</span></i><br />
<i><span style="font-family: "courier new" , "courier" , monospace;">public void setName( String name ) { this._name = name }</span></i><br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Se puede ver como existe un campo oculto , en este caso <b>_name</b> , en que si tan siquiera sabe de su existencia.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Vamos, en como toda la vida en Clipper/Harbour con los SETGET :-)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Pero entonces , ¿ como hago mi get/set particular ? Muy fácil, pero lo veremos en otro post.</span><br />
<br />Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-18118391972499330702017-08-18T11:00:00.004-07:002017-08-18T11:00:45.395-07:00KOTLIN. Propiedades y campos<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 26pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Propiedades y campos</span></div>
<h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;">
<span style="background-color: transparent; color: black; font-family: 'Open Sans'; font-size: 18pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Declaración de propiedades</span></h2>
<b id="docs-internal-guid-a46b92f8-f680-4103-fb4e-64755347ed8f" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Las clases en Kotlin pueden tener características. Estos pueden ser declarados como mutable, utilizando la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> o de sólo lectura utilizando la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Address {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> name: String = ...</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> street: String = ...</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> city: String = ...</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> state: String? = ...</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> zip: String = ...</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Para usar una propiedad, simplemente nos referimos a ella por su nombre, como si fuera un campo en Java:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> copyAddress(address: Address): Address {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> result = Address() </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// there's no 'new' keyword in Kotlin</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> result.name = address.name </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// accessors are called</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> result.street = address.street</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// ...</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> result</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<span style="color: #333333; font-family: "Open Sans"; font-size: 18pt; font-weight: 700; white-space: pre-wrap;"><br /></span>
<span style="color: #333333; font-family: "Open Sans"; font-size: 18pt; font-weight: 700; white-space: pre-wrap;">Getters y Setters</span><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La sintaxis completa para declarar una property es</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> <propertyName>[: <PropertyType>] [= <property_initializer>]</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> [<getter>]</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> [<setter>]</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El inicializador, getter y setter son opcionales. El tipo de propiedad es opcional si se puede inferir desde el inicializador (o desde el tipo de retorno getter, como se muestra a continuación).</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> allByDefault: Int? </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Error: Inicializador explícito requerido, getter y setter implícito</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> initialized = </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Tiene tipo Int, por defecto getter y setter</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La sintaxis completa de una declaración de propiedad de sólo lectura difiere de una mutable de dos maneras: comienza con val en lugar de var y no permite a un setter:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> simple: Int? </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// has type Int, default getter, must be initialized in constructor</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> inferredType = </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// has type Int and a default getter</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Podemos escribir descriptores personalizados, muy parecidos a las funciones ordinarias, dentro de una declaración de propiedad. He aquí un ejemplo de un getter personalizado:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> isEmpty: Boolean</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() = </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.size == </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un setter personalizado se ve así:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> stringRepresentation: String</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() = </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.toString()</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">set</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(value) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> setDataFromString(value) </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// parses the string and assigns values to other properties</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Por convención, el nombre del parámetro setter es </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">value</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, pero puede elegir un nombre diferente si lo prefiere.</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Desde Kotlin 1.1, puede omitir el tipo de property sí se puede inferir desde el getter:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> isEmpty </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() = </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.size == </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// por inferencia, tipo Boolean</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si necesita cambiar la visibilidad de un descriptor o anotarlo, pero no necesita cambiar la implementación predeterminada, puede definir el descriptor sin definir su cuerpo:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> setterVisibility: String = </span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"abc"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">private</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">set</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// the setter is private and has the default implementation</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> setterWithAnnotation: Any? = </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> @Inject </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">set</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// annotate the setter with Inject</span></div>
<b style="font-weight: normal;"><br /></b>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 13.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Campos de apoyo</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Las clases en Kotlin no pueden tener campos. Sin embargo, a veces es necesario tener un campo de respaldo cuando se utilizan descriptores personalizados. Para estos propósitos, Kotlin proporciona un campo de respaldo automático al que se puede acceder mediante el identificador de </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">field</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> counter = </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/</span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/ the initializer value is written directly to the backing field</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 9pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">set</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(value) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (value >= </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">field</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> = value</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El identificador de field sólo se puede utilizar en los accesores de la propiedad. Se generará un campo de respaldo para una propiedad si utiliza la implementación predeterminada de al menos uno de los accesores o si un accesor personalizado lo hace a través del identificador de campo. </span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Por ejemplo, en el caso siguiente no habrá campo de respaldo:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> isEmpty: Boolean</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() = </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.size == </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
<b style="font-weight: normal;"><br /></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 13.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Propiedades de apoyo</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si desea hacer algo que no encaja en este esquema de campo de respaldo implícito, siempre puede volver a tener una propiedad de respaldo:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">private</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> _table: Map<String, Int>? = </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> table: Map<String, Int></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (_table == </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">null</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> _table = HashMap() </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Type parameters are inferred</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> _table ?: </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">throw</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> AssertionError(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"Set to null by another thread"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En todos los aspectos, esto es lo mismo que en Java, ya que el acceso a propiedades privadas con getters y setters predeterminados está optimizado para que no se introduzca ninguna sobrecarga de llamada de función.</span></div>
<b style="font-weight: normal;"><br /></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 13.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Constante de tiempo de compilación</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Las propiedades cuyo valor se conoce en tiempo de compilación se pueden marcar como constantes de tiempo de compilación usando el modificador const. Tales propiedades deben cumplir los siguientes requisitos:</span></div>
<b style="font-weight: normal;"><br /></b>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Nivel superior o miembro de un objeto </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Inicializado con un valor del tipo String o un tipo primitivo </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ningún getter personalizado</span></div>
</li>
</ul>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tales propiedades se pueden utilizar en anotaciones:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> SUBSYSTEM_DEPRECATED: String = </span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"This subsystem is deprecated"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">@Deprecated(SUBSYSTEM_DEPRECATED) </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> foo() { ... }</span></div>
<b style="font-weight: normal;"><br /></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 13.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Propiedades con inicio tardío</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Normalmente, las propiedades declaradas como de tipo no nulo deben ser inicializadas en el constructor. Sin embargo, con bastante frecuencia esto no es conveniente. Por ejemplo, las propiedades se pueden inicializar mediante inyección de dependencia o en el método de configuración de una prueba de unitaria. En este caso, no puede proporcionar que no sea NULL en el constructor</span><span style="background-color: transparent; color: #555555; font-family: Arial; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> pero aún así desea evitar las comprobaciones nulas al referenciar la propiedad dentro del cuerpo de una clase. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Para manejar este caso, puede marcar la propiedad con el modificador </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lateinit</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">:</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> MyTest {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lateinit</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> subject: TestSubject</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> @SetUp </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> setup() {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> subject = TestSubject()</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> @Test </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> test() {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> subject.method() </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// dereference directly</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El modificador sólo se puede utilizar en propiedades </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> declaradas dentro del cuerpo de una clase (no en el constructor principal), y sólo cuando la propiedad no tiene un getter o Setter personalizado. El tipo de la propiedad debe ser no nulo y no debe ser un tipo primitivo.</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El acceso a una propiedad </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lateinit</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> antes de que se haya inicializado lanza una excepción especial que identifica claramente la propiedad a la que se accede y el hecho de que no se ha inicializado.</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 13.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sobrecarga de Propiedades</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 10pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Mirar </span><a href="http://xthefull.blogspot.com.es/2017/08/kotlin-clases-y-herencia.html" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 10pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">sobrecarga de propiedades</span></a></div>
<b style="font-weight: normal;"><br /></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 13.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Propiedades delegadas</span></div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El tipo más común de propiedades simplemente lee desde (y tal vez escribe a) un campo de respaldo. Por otro lado, con getters y setters personalizados se puede implementar cualquier comportamiento de una propiedad. En algún lugar en el medio, hay ciertos patrones comunes de cómo una propiedad puede funcionar. Algunos ejemplos: valores perezosos, lectura de un mapa por una clave determinada, acceso a una base de datos, notificando al oyente en el acceso, etc.</span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tales comportamientos comunes se pueden implementar como bibliotecas usando propiedades delegadas, que veremos mśa tarde.</span></div>
Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-76372878075199790252017-08-15T10:21:00.001-07:002017-08-15T10:21:56.091-07:00KOTLIN. Clases y Herencia.<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En una serie de post, iré publicando en español, la documentación sobre KOTLIN,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">referente a la Programación Orientado a Objetos.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-4a877237-e6ea-5379-b6da-7e16714e539f" style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Documentación y traducción sobre </span><a href="https://kotlinlang.org/docs/reference/classes.html" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">https://kotlinlang.org/docs/reference/classes.html</span></a></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Ubuntu; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">CLASES Y HERENCIA</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Para crear una clase en Kotlin, simplemente usaremos la palabra reservada, </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class </span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Invoice</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> {</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La declaración de clase consiste en el nombre de clase, el encabezado de clase (especificando sus parámetros de tipo, el constructor principal, etc.) y el cuerpo de clase, rodeado de llaves. Tanto el encabezado como el cuerpo son opcionales; Si la clase no tiene cuerpo, las llaves pueden ser omitidos.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Vacia</span></div>
<h3 dir="ltr" style="background-color: white; line-height: 1.3655172413793104; margin-bottom: 11pt; margin-top: 23pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Constructores</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Una clase en Kotlin puede tener un constructor principal y uno o más constructores secundarios. El constructor primario es parte del encabezado de clase: va después del nombre de clase (y los parámetros de tipo opcional).</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span></div>
<div dir="ltr" style="line-height: 1.8857142857142857; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Person </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(firstName: String) {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si el constructor principal no tiene ninguna anotación o modificadores de visibilidad, se puede omitir la palabra clave constructor</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Person(firstName: String) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El constructor principal no puede contener ningún código. El código de inicialización se puede colocar en los bloques de inicialización, que están prefijados con la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Customer(name: String, phone: String) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">init</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> logger.info(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"Customer initialized with value ${name}"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tenga en cuenta que los parámetros del constructor primario se pueden utilizar en los bloques de inicialización. También se pueden utilizar en los inicializadores de propiedades declarados en el cuerpo de la clase:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Customer(name: String) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> customerKey = name.toUpperCase()</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">De hecho, para declarar propiedades e inicializarlas desde el constructor primario, Kotlin tiene una sintaxis concisa:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Person(</span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> firstName: String, </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> lastName: String, </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> age: Int) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// ...</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">De la misma manera que las propiedades regulares, las propiedades declaradas en el constructor primario pueden ser mutable (var) o de sólo lectura (val)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si el constructor tiene anotaciones o modificadores de visibilidad, se requiere la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, y los modificadores van antes de ella:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Customer </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> @Inject </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(name: String) { ... }</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<h4 dir="ltr" style="background-color: white; line-height: 1.5; margin-bottom: 11pt; margin-top: 23pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Constructores secundarios</span></h4>
<div dir="ltr" style="background-color: white; line-height: 1.9636363636363636; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La clase también puede declarar constructores secundarios, que están prefijados con </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span></div>
<div dir="ltr" style="background-color: white; line-height: 1.9636363636363636; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Person {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(parent: Person) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> parent.children.add(</span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="background-color: white; line-height: 1.9636363636363636; margin-bottom: 11pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="background-color: white; line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si la clase tiene un constructor primario, cada constructor secundario necesita delegar al constructor principal, directa o indirectamente a través de otro constructor (s) secundario (s). La delegación a otro constructor de la misma clase se realiza mediante la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Person(</span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> name: String) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(name: String, parent: Person) : </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(name) {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> parent.children.add(</span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">this</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si una clase no abstracta no declara ningún constructor (primario o secundario), tendrá un constructor primario generado sin argumentos. La visibilidad del constructor será pública. Si no desea que su clase tenga un constructor público, debe declarar un constructor primario vacío con visibilidad no predeterminada:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> DontCreateMe </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">private</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> () {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">NOTA: En la JVM, si todos los parámetros del constructor principal tienen valores predeterminados, el compilador generará un constructor adicional sin parámetros que utilizará los valores predeterminados. Esto facilita el uso de Kotlin con bibliotecas como Jackson o JPA que crean instancias de clase a través de constructores sin parámetro</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Customer(</span><span style="background-color: transparent; color: #0037b3; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> customerName: String = </span><span style="background-color: transparent; color: #009c00; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">""</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Creación de instancias de clases </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Para crear una instancia de una clase, llamamos al constructor como si fuera una función regular:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> invoice = Invoice()</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> customer = Customer(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"Joe Smith"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tenga en cuenta que Kotlin no tiene una palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. La creación de instancias de clases internas anidadas, internas y anónimas se describe en Clases anidadas</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Miembros del grupo Las clases pueden contener Constructores y bloques de inicialización Funciones Propiedades Clases anidadas e internas Declaraciones de objetos</span></div>
<h3 dir="ltr" style="background-color: white; line-height: 1.3655172413793104; margin-bottom: 11pt; margin-top: 23pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Miembros de la clase</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Las clases pueden contener </span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Constructores y bloques de inicialización </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Funciones </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Propiedades </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Clases anidadas e internas </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Declaraciones de objetos</span></div>
</li>
</ul>
<h3 dir="ltr" style="background-color: white; line-height: 1.3655172413793104; margin-bottom: 11pt; margin-top: 23pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Herencia</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Todas las clases en Kotlin tienen una superclase común </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Any</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, que es un super por defecto para una clase sin supertipos declarados: </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Example </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 13.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Implícitamente hereda de Any </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Any no es java.lang.Object; En particular, no tiene ningún miembro que no sean </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">equals()</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hashCode()</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">toString()</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Consulte la sección de interoperabilidad de Java para obtener más detalles. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Para declarar un supertipo explícito, colocamos el tipo después de dos puntos en el encabezado de la clase:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Base(p: Int)</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Derived(p: Int) : Base(p)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si la clase tiene un constructor primario, el tipo de base puede (y debe) ser inicializado allí mismo, usando los parámetros del constructor primario.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si la clase no tiene un constructor principal, cada constructor secundario tiene que inicializar el tipo base utilizando la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> o delegar a otro constructor que lo haga. Tenga en cuenta que en este caso diferentes constructores secundarios pueden llamar a diferentes constructores del tipo base:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> MyView : View {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(ctx: Context) : </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(ctx)</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">constructor</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(ctx: Context, attrs: AttributeSet) : </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(ctx, attrs)</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La anotación </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> en una clase es lo opuesto al </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">final</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> de Java: permite que otros hereden de esta clase. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Por defecto, todas las clases en Kotlin son </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">final</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, lo que corresponde a </span><span style="background-color: transparent; color: #333333; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><a href="http://www.oracle.com/technetwork/java/effectivejava-136174.html" style="text-decoration: none;"><span style="background-color: transparent; color: #497bb7; font-family: 'Open Sans'; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Effective Java</span></a><span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, Item 17: </span><span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 10.5pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Design and document for inheritance or else prohibit it</span><span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Por lo tanto, para que una clase pueda ser heredable, hay que indicarlo</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">explícitamente con </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<h3 dir="ltr" style="background-color: white; line-height: 1.3655172413793104; margin-bottom: 11pt; margin-top: 23pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sobrecarga de methods</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Como mencionamos antes, nos apegamos a hacer las cosas explícitas en Kotlin. Y a diferencia de Java, Kotlin requiere anotaciones explícitas para los miembros overridable (los llamamos open) y para overrides:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Base {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> v() {}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> nv() {}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Derived() : Base() {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> v() {}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La anotación de </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> es necesaria para Derived.v (). Si eso falta, el compilador se quejaría. Si no hay anotación </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> en una función, como Base.nv (), declarar un método con la misma firma en una subclase es ilegal, ya sea con </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> o sin ella. En una clase final (por ejemplo, una clase sin anotación </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">), los miembros abiertos están prohibidos. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un miembro marcado </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> está abierto, es decir, puede ser anulado en subclases. Si desea prohibir el reemplazo, use final:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> AnotherDerived() : Base() {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">final</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> v() {}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<h3 dir="ltr" style="background-color: white; line-height: 1.3655172413793104; margin-bottom: 11pt; margin-top: 23pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sobrecarga de propiedades</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Las sobrecarga de propiedades funcionan de manera similar a los métodos sobrecargados; las propiedades declaradas en una superclase que luego se re-declaran en una clase derivada deben ser prefaciadas con </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y deben tener un tipo compatible. Cada propiedad declarada puede ser anulada por una propiedad con un inicializador o por una propiedad con un método getter.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Foo {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> x: Int </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> { ... }</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Bar1 : Foo() {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> x: Int = ...</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">También puede anular(</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) una propiedad </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> con una propiedad </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, pero no viceversa. Esto se permite porque una propiedad </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> esencialmente declara un método </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">getter</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, y reemplazarlo como una </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, además, declara un método </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">setter</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> en la clase derivada. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tenga en cuenta que puede utilizar la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> como parte de la declaración de propiedad en un constructor principal.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">interface</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Foo {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> count: Int</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Bar1(</span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> count: Int) : Foo</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Bar2 : Foo {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> count: Int = </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<h3 dir="ltr" style="background-color: white; line-height: 1.3655172413793104; margin-bottom: 11pt; margin-top: 23pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Llamando a la implementación de la SuperClass</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Código en una clase derivada puede llamar a sus funciones de superclase y las implementaciones de los accesores de propiedad usando la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.8857142857142857; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Foo {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f() { println(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"Foo.f()"</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) }</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> x: Int </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() = </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Bar : Foo() {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f() { </span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.f()</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> println(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"Bar.f()"</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) </span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> x: Int </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() = </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.x + </span><span style="background-color: transparent; color: blue; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Dentro de una clase interna, acceder a la superclase de la clase externa se hace </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">con la palabra clave </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> calificada con el nombre de clase exterior: </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super@Externa</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">:</span></div>
<div dir="ltr" style="line-height: 1.7999999999999998; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Bar : Foo() {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f() { </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/* ... */</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> x: String </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() = </span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"..."</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">inner</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Baz {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> g() {</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">@Bar.f() </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Calls Foo's implementation of f()</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> println(</span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">@Bar.x) </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// Uses Foo's implementation of x's getter</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.8857142857142857; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Reglas primordiales</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En Kotlin, la herencia de implementación está regulada por la siguiente regla: si una clase hereda muchas implementaciones del mismo miembro de sus superclases inmediatas, debe reemplazar a este miembro y proporcionar su propia implementación (tal vez usando uno de los heredados). Para denotar el supertipo del cual se toma la implementación heredada, usamos </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">calificado por el nombre de supertipo en corchetes angulares, p. </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Super <Base></span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">:</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> A {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f() { print(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"A"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> a() { print(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"a"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">interface</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> B {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f() { print(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"B"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) } </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// interface members are 'open' by default</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b() { print(</span><span style="background-color: transparent; color: #009c00; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">"b"</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> C() : A(), B {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// The compiler requires f() to be overridden:</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f() {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><A>.f() </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// call to A.f()</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><B>.f() </span><span style="background-color: transparent; color: grey; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// call to B.f()</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Está bien heredar de A y B, y no tenemos problemas con a () y b () ya que C hereda una sola implementación de cada una de estas funciones. Pero para f () tenemos dos implementaciones heredadas por C, y por lo tanto tenemos que sobreescribir f () en C y proporcionar nuestra propia implementación que elimina la ambigüedad.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="line-height: 1.8857142857142857; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Clases Abstractas</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Una clase y algunos de sus miembros pueden ser declarados abstractos, </span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">abstract</span><span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Un miembro abstracto no tiene una implementación en su clase. Tenga en cuenta que no necesitamos anotar una clase o una función abstracta con open - no hace falta decirlo.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Podemos sobreescribir un miembro, override, abierto no abstracto con una abstracta;</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Base {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">open</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f() {}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">abstract</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Derived : Base() {</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">override</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">abstract</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #0037b3; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> f()</span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: #252525; font-family: Consolas; font-size: 10.5pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">}</span></div>
<div dir="ltr" style="line-height: 1.8857142857142857; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #333333; font-family: 'Open Sans'; font-size: 14.5pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Objetos complementarios</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En Kotlin, a diferencia de Java o C #, las clases no tienen métodos estáticos. En la mayoría de los casos, se recomienda simplemente usar funciones a nivel de paquete. Si necesita escribir una función que puede llamarse sin tener una instancia de clase pero necesita acceso a los elementos internos de una clase (por ejemplo, un factory method), puede escribirla como miembro de una declaración de objeto dentro de esa clase. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 11pt; margin-top: 0pt;">
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Incluso más específicamente, si declara un objeto complementario dentro de su clase, podrá llamar a sus miembros con la misma sintaxis que llamar a métodos estáticos en Java / C #, utilizando sólo el nombre de clase como calificador.</span></div>
<div>
<span style="background-color: transparent; color: #252525; font-family: Arial; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-2369134473954287302017-08-12T15:37:00.000-07:002017-08-12T15:37:50.857-07:00KOTLIN en AndroidHace relativamente poco tiempo, desde Google se le da soporte oficial para programar en <div>
Android con Kotlin.</div>
<div>
<br /></div>
<div>
Y en esas que he estado mirando que este 'nuevo' lenguaje de programación, y la verdad es que</div>
<div>
me está gustando todo lo que leo y probando con Android.</div>
<div>
<br /></div>
<div>
En el sitio oficial , tenemos <a href="http://kotlinlang.org/">http://kotlinlang.org/</a> tenemos que nos indica que podemos trabajar</div>
<div>
del lado servidor, con Android, o "<span style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; font-size: 19px; font-weight: 700;">transpilar"</span> a JavaScript. ( Venga otra palabreja que no existe</div>
<div>
en el español, vamos lo que hace es convertir un lenguaje a otro, pero.... seamos COOL!! )</div>
<div>
<br /></div>
<div>
<div class="tree-item tree-leaf js-item js-leaf" style="color: #333333; font-family: "Open Sans", Helvetica, Arial, sans-serif; font-size: 14px; margin: 10px -12px; padding-left: 24px; padding-right: 24px;">
<a class="tree-item-title tree-leaf-title js-item-title js-leaf-title" href="http://kotlinlang.org/docs/reference/server-overview.html" style="color: #497bb7; display: inline-block; margin-left: -12px; margin-right: -12px; padding-left: 12px; padding-right: 12px;"><span class="text" style="display: inline-block; position: relative;">Kotlin for Server Side</span></a></div>
<div class="tree-item tree-leaf js-item js-leaf" style="color: #333333; font-family: "Open Sans", Helvetica, Arial, sans-serif; font-size: 14px; margin: 10px -12px; padding-left: 24px; padding-right: 24px;">
<a class="tree-item-title tree-leaf-title js-item-title js-leaf-title" href="http://kotlinlang.org/docs/reference/android-overview.html" style="color: #497bb7; display: inline-block; margin-left: -12px; margin-right: -12px; padding-left: 12px; padding-right: 12px;"><span class="marker" style="display: inline;"></span><span class="text" style="display: inline-block; position: relative;">Kotlin for Android</span></a></div>
<div class="tree-item tree-leaf js-item js-leaf" style="color: #333333; font-family: "Open Sans", Helvetica, Arial, sans-serif; font-size: 14px; margin: 10px -12px; padding-left: 24px; padding-right: 24px;">
<a class="tree-item-title tree-leaf-title js-item-title js-leaf-title" href="http://kotlinlang.org/docs/reference/js-overview.html" style="color: #497bb7; display: inline-block; margin-left: -12px; margin-right: -12px; padding-left: 12px; padding-right: 12px;"><span style="color: #497bb7;"><span class="marker" style="display: inline; margin-left: -12px; margin-right: -12px; padding-left: 12px; padding-right: 12px;"></span></span><span class="text" style="color: #497bb7; display: inline-block; margin-left: -12px; margin-right: -12px; padding-left: 12px; padding-right: 12px; position: relative;">Kotlin for JavaScript</span></a></div>
</div>
<div>
<br /></div>
<div>
Dejando de lado el Server Side o JS, nos centramos solo un poco en Android, y una de las cosas</div>
<div>
guapas , guapas de verdad , es usar LAMBDA para cosas como está;</div>
<div>
<br /></div>
<div>
<pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: 'Source Code Pro'; font-size: 11,3pt;">button.setOnClickListener( <span style="color: #cc7832;">object </span>: View.OnClickListener {
<span style="color: #cc7832;">override fun </span><span style="color: #ffc66d;">onClick</span>(p0: View?) {
toast( <span style="color: #6a8759;">"Hello </span><span style="color: #cc7832;">${ </span>editText.<span style="color: #9876aa; font-style: italic;">text</span><span style="color: #cc7832;">}</span><span style="color: #6a8759;">" </span>)
}
})</pre>
</div>
<div>
<br /></div>
<div>
Es fácilmente convertido a esto, cosa que Android Studio te lo hace automáticamente ;</div>
<div>
<br /></div>
<div>
<pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: 'Source Code Pro'; font-size: 11,3pt;">button.setOnClickListener <span style="font-weight: bold;">{ </span>toast( <span style="color: #6a8759;">"Hello </span><span style="color: #cc7832;">${ </span>editText.<span style="color: #9876aa; font-style: italic;">text</span><span style="color: #cc7832;">}</span><span style="color: #6a8759;">" </span>) <span style="font-weight: bold;">}</span></pre>
</div>
<div>
<br /></div>
<div>
¿ No es maravilloso ? ;-)</div>
<div>
<br /></div>
<div>
Lo guapo de Kotlin es que es capaz de mezclar clases de Java con Kotlin sin problemas,</div>
<div>
pues Kotlin lo que hace es generar bytecode de la JVM.</div>
<div>
<br /></div>
<div>
Además, trae muchas mejoras en el ámbito de la programación funcional, soporte de evaluación</div>
<div>
perezosa, inferencias de tipo, etc..</div>
<div>
<br /></div>
<div>
Seguimos aprendiendo KotLin.</div>
<div>
Un sitio que está muy bien y en español; <a href="https://antonioleiva.teachable.com/courses/kotlin-desarrolladores-android">https://antonioleiva.teachable.com/courses/kotlin-desarrolladores-android</a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-2681717913817932972017-05-19T06:42:00.001-07:002017-05-19T06:42:11.991-07:00GTXSII. Visual Basic .NET<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Jr54dii1d3yOsqXTf2KWTU30Xntko6SEp0FrZE95AJ6QPItHt2ceAqbTLu7U0ZvzsqwjMj2nlJw8fSN0GWQJx54gfCLyIrwRpGQz1rDYKuEa4DsgdoQttrz5MioBiV1z8z4fKxXguUrl/s1600/logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Jr54dii1d3yOsqXTf2KWTU30Xntko6SEp0FrZE95AJ6QPItHt2ceAqbTLu7U0ZvzsqwjMj2nlJw8fSN0GWQJx54gfCLyIrwRpGQz1rDYKuEa4DsgdoQttrz5MioBiV1z8z4fKxXguUrl/s320/logo.png" width="320" /></a></div>
<br />
Estamos trabajando muy duro en intentar en soportar más lenguajes de programación para nuestra librería <b>GtxSII, </b>para el Suministro Inmediato de Información.<br />
<br />
Ahora sumamos el soporte de <b>Visual Basic</b>, VB.NET, ejemplo muy simple de código, para<br />
crear una factura emitida;<br />
<br />
<br />
<div dir="ltr" style="background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px; margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 451.276pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 39pt;"><td style="background-color: #ffe599; border-color: rgb(0, 0, 0); border-style: solid; border-width: 1pt; padding: 5pt; vertical-align: top;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="color: #222222; white-space: pre;"> </span><span style="color: #222222;"><span style="white-space: pre;">Public Class Form1
Public oGtxSii As Object
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
oGtxSii = CreateObject("GTXSII")
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox(oGtxSii.Version)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim oServicio = oGtxSii.Create("SuministroLRFacturasEmitidas")
Dim oRequest = oServicio.oRequest
oRequest.Cabecera.Titular.NombreRazon = TextRazon.Text
oRequest.Cabecera.Titular.NIF = TextNIF.Text
oRequest.Cabecera.TipoComunicacion = "A0"
Dim oFacturaEmitida = oRequest.GetFactura()
oFacturaEmitida.PeriodoImpositivo.Ejercicio = 2017
oFacturaEmitida.PeriodoImpositivo.Periodo = "03"
oFacturaEmitida.IDFactura.NIF = TextNIF.Text
oFacturaEmitida.IDFactura.NumSerieFacturaEmisor = TextFactura.Text
oFacturaEmitida.IDFactura.FechaExpedicionFacturaEmisor = Date.ParseExact(TextFecha.Text, "dd/MM/yyyy",
System.Globalization.DateTimeFormatInfo.InvariantInfo)
oFacturaEmitida.FacturaExpedida.TipoFactura = "F1"
oFacturaEmitida.FacturaExpedida.ClaveRegimenEspecialOTrascendencia = "01"
oFacturaEmitida.FacturaExpedida.ImporteTotal = 270.0
oFacturaEmitida.FacturaExpedida.DescripcionOperacion = "Ventas de productos"
oFacturaEmitida.FacturaExpedida.Contraparte.NombreRazon = "EMPRESAXXXX"
oFacturaEmitida.FacturaExpedida.Contraparte.NIFRepresentante = ""
oFacturaEmitida.FacturaExpedida.Contraparte.NIF = "A17035080"
Dim Sujeta = oFacturaEmitida.FacturaExpedida.TipoDesglose.DesgloseFactura.Sujeta
Sujeta.TipoNoExenta = "S1"
Dim oDetalleIVA = Sujeta.GetDetalleIVA()
oDetalleIVA.TipoImpositivo = 21
oDetalleIVA.BaseImponible = 123.97
oDetalleIVA.CuotaRepercutida = 26.03
If oServicio.Send() Then
TextRequest.Text = oRequest.GetXML()
Dim oResponse = oServicio.oResponse
viewResponse(oResponse)
Else
TextRequest.Text = oRequest.GetXML()
If oServicio.nHostError = -1 Then
MsgBox("Incidencia detectada " & CStr(oServicio.nHostError) & " " & oServicio.cHostErrorMsg)
Else
Dim oResponse = oServicio.oResponse
If IsNothing(oResponse) Then
MsgBox("Incidencia detectada " & CStr(oServicio.nHostError) & " " & oServicio.cHostErrorMsg)
Else
viewResponse(oResponse)
End If
End If
End If
oServicio = Nothing
oRequest = Nothing
End Sub
Private Sub viewResponse(oResponse As Object)
Dim cValue
cValue = "CSV :" + oResponse.CSV + vbCrLf +
"IDVersionSii:" + oResponse.Cabecera.IDVersionSii + vbCrLf +
"NombreRazon :" + oResponse.Cabecera.Titular.NombreRazon + vbCrLf +
"NIF :" + oResponse.Cabecera.Titular.NIF + vbCrLf +
"EstadoEnvio :" + oResponse.EstadoEnvio + vbCrLf +
"NIFPresentador :" + oResponse.DatosPresentacion.NIFPresentador + vbCrLf +
"TimestampPresentacion :" + oResponse.DatosPresentacion.TimestampPresentacion + vbCrLf +
"------------------------REGISTROS----------------------------------" + vbCrLf
For Each oRespuesta In oResponse.RespuestaLinea
cValue = cValue + "EstadoRegistro :" + oRespuesta.EstadoRegistro + vbCrLf +
"CodigoErrorRegistro :" + oRespuesta.CodigoErrorRegistro + vbCrLf +
"DescripcionErrorRegistro :" + oRespuesta.DescripcionErrorRegistro + vbCrLf
Dim oFactura = oRespuesta.IDFactura
cValue = cValue + "NIF :" + oFactura.NIF + vbCrLf +
"NumSerieFacturaEmisor :" + oFactura.NumSerieFacturaEmisor + vbCrLf +
"NumSerieFacturaEmisorResumenFin :" + oFactura.NumSerieFacturaEmisorResumenFin + vbCrLf +
"FechaExpedicionFacturaEmisor :" + oFactura.FechaExpedicionFacturaEmisor + vbCrLf
Next
TextResponse.Text = cValue
End Sub
End Class</span></span></span></td></tr>
</tbody></table>
</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuLvKlEeMzlmNX2bXGkg-6hJsn9sMjXJofN84NSS0Xe6sd5T2p23CWkddHbHDjhIGjmLFEG05jiEt_m2QYbGxBvS_xSo0qisj2Gn0tDsVu73J_gK7UZnnvrRMbJrQyJd8yaxJtnVekX2dO/s1600/gtxsii_vbnet.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuLvKlEeMzlmNX2bXGkg-6hJsn9sMjXJofN84NSS0Xe6sd5T2p23CWkddHbHDjhIGjmLFEG05jiEt_m2QYbGxBvS_xSo0qisj2Gn0tDsVu73J_gK7UZnnvrRMbJrQyJd8yaxJtnVekX2dO/s640/gtxsii_vbnet.PNG" width="640" /></a></div>
<br />Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-4338666344725947382017-05-02T13:54:00.002-07:002017-05-02T13:55:19.500-07:00GTXSII. Nuestra solución al Suministro Inmediato de Información.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvvyzBzfRO2WClx6C53D5d3jgMB5lnO7NbSNUdOmBs0MBR9Qd-kxJP2OOs_GI_o88rF1F4f3wczpZjrU1sY5dvEbJDdSIfE4XYvs9AE4qcGQvbeTFSOw3CvwoY616cHf7GaLs7SlOuFdua/s1600/logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvvyzBzfRO2WClx6C53D5d3jgMB5lnO7NbSNUdOmBs0MBR9Qd-kxJP2OOs_GI_o88rF1F4f3wczpZjrU1sY5dvEbJDdSIfE4XYvs9AE4qcGQvbeTFSOw3CvwoY616cHf7GaLs7SlOuFdua/s320/logo.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Bien es sabido que el próximo 1 de Julio entra en vigor la nueva ley sobre la declaración del IVA para determinadas empresas que cumplan unos requisitos.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Desde getex hemos estado trabajando duro para poder ofrecer una solución profesional a todos nuestros compañeros y amigos programadores de Harbour y sus variantes.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Pero hemos intentado ir un poco más allá, y aún a costa de dedicar más horas y recursos, hemos creado además una DLL que puede ser usado por otros lenguajes, como ;</div>
<div class="separator" style="clear: both; text-align: left;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Visual Basic, Foxpro, Alaska xbase++, scripting desde sistema o JavaScript, Delphi, etc..</b></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Desde Fivewin pasando por Xailer, usando compiladores de BCC o Mingw. </b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Además, también hemos portado la validación de NIF, persona física o jurídica de la AET, y estamos también la portando la consulta de operadores intracomunitarios a través de VIES.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Tenéis toda la información en <a href="http://www.getex.net/sii/">http://www.getex.net/sii/</a></div>
Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-12727087789462185372017-04-25T03:06:00.000-07:002017-04-25T04:50:45.399-07:00Convertir XML a Hash en Harbour ( Update V )<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKiEjP4LbCQ3QY6hTkQmfR9RSNPWp9N313yR8_GJEMCVGXUeRuOZPmIefVQOtHI1X3Jn7ztnupou3wTjzoML03XfvXqNTmxwgyOQ6zfLiB5StkES1Yheg6eR6KOzriHnr5pm64Mlpke7TR/s1600/Alphabet_22.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKiEjP4LbCQ3QY6hTkQmfR9RSNPWp9N313yR8_GJEMCVGXUeRuOZPmIefVQOtHI1X3Jn7ztnupou3wTjzoML03XfvXqNTmxwgyOQ6zfLiB5StkES1Yheg6eR6KOzriHnr5pm64Mlpke7TR/s320/Alphabet_22.jpg" width="320" /></a></div>
<br />
Bueno, pues de probar con un montón de XML diferentes , me encuentro que uno de tantos cientos probamos, no lo hace como se esperaba.<br />
<br />
Simplificando y reduciendo el XML para ver donde está el problema;<br />
<br />
<div dir="ltr" style="margin-left: 0pt;">
<br />
<table style="border-collapse: collapse; border: none; width: 451.27559055118115pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 39pt;"><td style="background-color: #ffe599; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><span style="font-family: "courier new" , "courier" , monospace;"><?xml version="1.0" encoding="utf-8"?></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <UpdateCustomerProfile> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <request> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <Id>001</Id> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ReservationNumber>123456</ReservationNumber></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <Email> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <<b>string</b>>uno@moo.com</<b>string</b>></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <<b>string</b>><span style="color: blue;"><b>dos@moo.com</b></span></<b>string</b>></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </Email></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </request></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></UpdateCustomerProfile></span><span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: "courier new" , "courier" , monospace;"> </span> </span></td></tr>
</tbody></table>
</div>
<div>
<br /></div>
<div>
Al pasar por la función XMTOHASH( ), el efecto que ocurre es que solo tendremos el valor</div>
<div>
de string, con el ultimo valor, <b style="background-color: #ffe599; color: blue;">dos@moo.com</b></div>
<div>
<br /></div>
<div>
¿ Y porque ocurre esto ? </div>
<div>
<br /></div>
<div>
Ocurre simplemente, porque se ha llegado al final , y no tiene hijos, y como el node se llama igual, lo que hace la función es volver asignarle a hash con la clave string ,que si tenemos, con el nuevo valor.</div>
<div>
La consecuencia es que no podemos tener los valores de ninguna de las maneras.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY5WQ5lFqDUoFIL2Jl3RPvnf7v8QG2bGtxAowBdLcxWUJyJcAXaPgqr0OvAEMKzAJCz6yPD0mqaVtuDMICKJqpGXrEIKp_JLQ3vNFWVL2Pzkzw_gQNcvl14X1rkK9Dpc_6huqmqo3bzDFb/s1600/hash_malformado.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY5WQ5lFqDUoFIL2Jl3RPvnf7v8QG2bGtxAowBdLcxWUJyJcAXaPgqr0OvAEMKzAJCz6yPD0mqaVtuDMICKJqpGXrEIKp_JLQ3vNFWVL2Pzkzw_gQNcvl14X1rkK9Dpc_6huqmqo3bzDFb/s640/hash_malformado.PNG" width="640" /></a></div>
<div>
<br /></div>
<div>
Como podéis observa en la imagen, el hash solo podemos tener el último valor del string.</div>
<div>
<br /></div>
<div>
Bien, ¿ como solucionarlo ? </div>
<div>
<br /></div>
<div>
Sencillamente, vamos a crear un array de childs, que en caso que la clave sea igual a lo que tengo, se guardará posteriormente para remplazar el valor que hay por este array child.</div>
<div>
En casos como este, tendremos que preguntar si el valor del hash["string"] de que tipo es,</div>
<div>
<b>CARACTER </b>o <b>ARRAY</b>, para procesar posteriormente el hash.</div>
<div>
<br /></div>
<div>
Aquí el código final, en color azul, el parche aplicar a la funcion recursiva NodeToHash();</div>
<div>
<br /></div>
<div>
<br />
<table style="border-collapse: collapse; border: none; width: 451.276pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 39pt;"><td style="background-color: #ffe599; border-color: rgb(0, 0, 0); border-style: solid; border-width: 1pt; padding: 5pt; vertical-align: top;"><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span style="white-space: pre;"><span style="white-space: pre;">STATIC FUNCTION NodeToHash( node )
Local hNext
Local hHashChild := {=>}
Local hHash := {=>}
Local node2
</span><span style="color: blue; white-space: pre;"> </span><span style="color: blue;"><span style="white-space: pre;">Local hChild := {=>}, cKey
/*
hChild es un hash, que tiene la key en el cual vamos añadiendo </span></span></span></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span style="white-space: pre;"><span style="color: blue;"><span style="white-space: pre;"> en el array los elementos iguales.
*/</span></span><span style="white-space: pre;">
WHILE node != NIL
IF mxmlGetType( node ) == MXML_ELEMENT
if HB_HHASKEY( hHash, mxmlGetElement( node ) )
if valtype( hHash[ mxmlGetElement( node ) ] ) <> "A"
<span style="color: blue;"> if empty( hChild )
hChild[ mxmlGetElement( node ) ] := {}
aadd( hChild[ mxmlGetElement( node ) ] , hHash[ mxmlGetElement( node ) ] )
aadd( hChild[ mxmlGetElement( node ) ] , mxmlGetOpaque( node ) ) // Mas el valor del nuevo nodo
else
aadd( hChild[ mxmlGetElement( node ) ], mxmlGetOpaque( node ) ) // Mas el valor del nuevo nodo
endif
</span> hHash[ mxmlGetElement( node ) ] := mxmlGetOpaque( node )
else
// Es un array, por lo tanto, no lo tocamos
endif
else
hHash[ mxmlGetElement( node ) ] := mxmlGetOpaque( node )
endif
if empty( mxmlGetOpaque( node ) ) // Miramos dentro
hNext := mxmlWalkNext( node, node, MXML_DESCEND )
if hNext != NIL
hHashChild := NodeToHash( hNext )
// Correcion de Posible bug. Un elemento con espacios en blanco, deja descender un nivel!, cuando no debería!
// example <element> </element>
if hHashChild != NIL .and. !empty( hHashChild )
if empty( hHash[ mxmlGetElement( node ) ] )
hHash[ mxmlGetElement( node ) ] := {}
endif
if HB_MXMLGETATTRSCOUNT( node ) > 0
hHashChild[ mxmlGetElement( node ) + "@attr"] := HB_MXMLGETATTRS( node )
endif
AADD( hHash[ mxmlGetElement( node ) ], hHashChild )
endif
else ////
if HB_MXMLGETATTRSCOUNT( node ) > 0
if empty( hHash[ mxmlGetElement( node ) ] )
hHash[ mxmlGetElement( node ) ] := {}
endif
AADD( hHash[ mxmlGetElement( node ) ], HB_MXMLGETATTRS( node ) )
endif
endif
else
if HB_MXMLGETATTRSCOUNT( node ) > 0
hHash[ mxmlGetElement( node ) + "@attr"] := HB_MXMLGETATTRS( node )
endif
endif
ENDIF
</span><span style="white-space: pre;">
node := mxmlGetNextSibling( node )
END WHILE
</span></span></span><br />
<span style="color: blue; font-family: courier new, courier, monospace; font-size: x-small;"><span style="white-space: pre;"> // En caso que el array tenga mas de un elemento, tenemos que alimentarlo</span></span><br />
<span style="color: blue; font-family: courier new, courier, monospace; font-size: x-small;"><span style="white-space: pre;"> // con el array de su clave.</span></span><br />
<span style="color: blue; font-family: courier new, courier, monospace; font-size: x-small;"><span style="white-space: pre;"> if !empty( hChild )</span></span><br />
<span style="color: blue; font-family: courier new, courier, monospace; font-size: x-small;"><span style="white-space: pre;"> cKey := hb_HKeyAt( hChild, 1) </span></span><br />
<span style="color: blue; font-family: courier new, courier, monospace; font-size: x-small;"><span style="white-space: pre;"> hHash[ cKey ] := hChild[ cKey ]</span></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span style="white-space: pre;"><span style="white-space: pre;"><span style="color: blue;"> endif </span> </span></span></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span style="white-space: pre;"><span style="white-space: pre;">
return hHash</span></span></span><span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: x-small;"> </span> </span> </span></td></tr>
</tbody></table>
</div>
<div>
<br /></div>
<div>
Como consecuencia de este trozo de código , ahora tenemos en un array los elementos disponibles;</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie41bv-9i-vSzoF9hmFkSsi6iJIm9s27wZjh2wRUifrfAsG5tASMbwBi7KsUqpatpQYfHeMRTCUKnbgFBrx-8w7rRhqTC4ZQMzSO6KEY0wpLu6oEvrV7r7d67meSOXMMzbkXTasjbcubSU/s1600/hash_bienformado.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie41bv-9i-vSzoF9hmFkSsi6iJIm9s27wZjh2wRUifrfAsG5tASMbwBi7KsUqpatpQYfHeMRTCUKnbgFBrx-8w7rRhqTC4ZQMzSO6KEY0wpLu6oEvrV7r7d67meSOXMMzbkXTasjbcubSU/s640/hash_bienformado.PNG" width="640" /></a></div>
<div>
<br /></div>
<div>
Si si, eso esta muy bien, pero algo como esto; <b>( Incrédulos ;-) )</b></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 451.276pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 39pt;"><td style="background-color: #ffe599; border-color: rgb(0, 0, 0); border-style: solid; border-width: 1pt; padding: 5pt; vertical-align: top;"><span style="font-family: "courier new" , "courier" , monospace;"><?xml version="1.0" encoding="utf-8"?></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <UpdateCustomerProfile> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <request> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <Id>001</Id> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ReservationNumber>123456</ReservationNumber></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <Email> </span><br />
<span style="font-family: "courier new", courier, monospace;"> <</span><b style="font-family: "courier new", courier, monospace;">string</b><span style="font-family: "courier new", courier, monospace;">>uno@moo.com</</span><b style="font-family: "courier new", courier, monospace;">string</b><span style="font-family: "courier new", courier, monospace;">></span><br />
<span style="font-family: "courier new", courier, monospace;"> <</span><b style="font-family: "courier new", courier, monospace;">string</b><span style="font-family: "courier new", courier, monospace;">></span><span style="color: blue; font-family: "courier new", courier, monospace;"><b>dos@moo.com</b></span><span style="font-family: "courier new", courier, monospace;"></</span><b style="font-family: "courier new", courier, monospace;">string</b><span style="font-family: "courier new", courier, monospace;">></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <</span><b style="font-family: "Courier New", Courier, monospace;">string</b><span style="font-family: "courier new" , "courier" , monospace;">></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <<b>string</b>><span style="color: blue;"><b>compicado@es.es</b></span></<b>string</b>></span><br />
<div>
<span style="color: blue; font-family: "courier new" , "courier" , monospace;"><b> </b></span><span style="font-family: "courier new" , "courier" , monospace;"></</span><b style="font-family: "Courier New", Courier, monospace;">string</b><span style="font-family: "courier new" , "courier" , monospace;">></span></div>
<span style="font-family: "courier new" , "courier" , monospace;"> </Email></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </request></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></UpdateCustomerProfile></span><span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: "courier new" , "courier" , monospace;"> </span> </span><br />
<div>
<br /></div>
</td></tr>
</tbody></table>
</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidDGzQhckbu7tPR8748VCjiGK3zRmmEUWLnMkR8Pg112BpcPaalvDdE4a8PyFXko9jhkLH3kFEz7X2oLwvpiSjtPii-4hWTL1b3kK9uLqJMdP71ZJ0s7AN5FJB188xD2tMRswQ3XDrjVzh/s1600/hash_bienformado2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidDGzQhckbu7tPR8748VCjiGK3zRmmEUWLnMkR8Pg112BpcPaalvDdE4a8PyFXko9jhkLH3kFEz7X2oLwvpiSjtPii-4hWTL1b3kK9uLqJMdP71ZJ0s7AN5FJB188xD2tMRswQ3XDrjVzh/s640/hash_bienformado2.PNG" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin3yTypVHfsFP14WYwcqB7pYoDwxIXCTMdwbE16896MJi9XUHnuepbXi9VBFDxJARn4aCzzwk84QogYfPqPKTouq2Jx0yOsYKJSQKV2LOMNSeZlWni5OlP556xKc0_MjOvYC9uUb6GFAfx/s1600/hash_bienformado3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="54" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin3yTypVHfsFP14WYwcqB7pYoDwxIXCTMdwbE16896MJi9XUHnuepbXi9VBFDxJARn4aCzzwk84QogYfPqPKTouq2Jx0yOsYKJSQKV2LOMNSeZlWni5OlP556xKc0_MjOvYC9uUb6GFAfx/s640/hash_bienformado3.PNG" width="640" /></a></div>
<div>
<br /></div>
<div>
Disfruten del parche! </div>
Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-64236464546280171222017-03-22T14:35:00.002-07:002017-03-22T14:35:39.206-07:00Se rompió la BIOS.Estaba yo dispuesto a pasar un fin de semana de relax en el ordenador , cuando de repente, lo que nunca me había pasado, y mira que se me han roto casi TODO lo que cae en mis manos ;<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP-8jKVuBfeGO6OV8XG6dbqNw87ekhFTN7VIDB2pnY3omTZadILpKDENIM8qGYGbyiCgUD9T0Y_FvZaYne4C6AOeELEudW2Ko-2VjYVk89GOdJX7oF7O9WSeideyOalwvy0OT1oximyJpb/s1600/bios.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP-8jKVuBfeGO6OV8XG6dbqNw87ekhFTN7VIDB2pnY3omTZadILpKDENIM8qGYGbyiCgUD9T0Y_FvZaYne4C6AOeELEudW2Ko-2VjYVk89GOdJX7oF7O9WSeideyOalwvy0OT1oximyJpb/s320/bios.png" width="320" /></a></div>
<br />
<br />
<br />
<div style="text-align: center;">
<b><span style="font-size: large;">ACOJONADO!!! Al menos se recupero con el Backup</span></b></div>
<br />
¿ La consecuencia de esto ? Pues el efecto lateral en Linux /Linux Ubuntu es que dejaron de funcionar los USB-2, solo los UBS-3 iban, pero lo pero de todo ello, es que las conexiones Bluetooh, Red, Impresoras, etc dejaron de funcionar.<br />
<br />
Rebuscando por Internet, creo que hace tiempo ya lo realice en prueba y error, encontré que la placa<br />
<b><span style="background-color: #ebece4; font-family: Ubuntubeta, Ubuntu, "Bitstream Vera Sans", "DejaVu Sans", Tahoma, sans-serif; font-size: 13px;">GIGABYTE GA-990FXA-UD3</span><span style="background-color: #ebece4; font-family: Ubuntubeta, Ubuntu, "Bitstream Vera Sans", "DejaVu Sans", Tahoma, sans-serif; font-size: 13px;"> </span> hay que activar en la BIOS, </b><span style="background-color: white; font-family: Ubuntubeta, Ubuntu, "Bitstream Vera Sans", "DejaVu Sans", Tahoma, sans-serif;"><i style="font-size: 13px;"> </i><b><u><span style="color: red;">IOMMU to "Enabled".</span></u></b></span><span style="background-color: white; font-family: Ubuntubeta, Ubuntu, "Bitstream Vera Sans", "DejaVu Sans", Tahoma, sans-serif;"><b><u><span style="color: red;"> !!!!</span></u></b></span><br />
<span style="background-color: white; font-family: Ubuntubeta, Ubuntu, "Bitstream Vera Sans", "DejaVu Sans", Tahoma, sans-serif;"><b><u><span style="color: red;"><br /></span></u></b></span>
<br class="Apple-interchange-newline" />Ahora ya funciona RED y USB.<br />
<br />
<span style="background-color: white; color: #424242; font-family: "Open Sans", sans-serif; font-size: 14px;">"La IOMMU es una unidad de gestión de la memoria, similar a la MMU, que se sitúa entre un bus de E/S y la memoria." Pues cony, DEJALO ACTIVADO POR DEFECTO!!!! ;-)</span>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-7696775246557422302016-08-12T04:34:00.000-07:002016-08-12T04:34:44.629-07:00Como auditar cambios usando triggers en Harbour<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizHQHfC3fhXx2H_Xdz8RZKFLcx9iZQJjisJEf5SkmaykYUuoZK8eKEcV7qXffinsLF0j9Zt-X5mzPaKj5rqSRAQ2LFu8v3mnaXfJm3GVHB-j8V_AQdBGh_TLUitiezB1ZoqJaQhwwicxpH/s1600/Trigger-Event1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizHQHfC3fhXx2H_Xdz8RZKFLcx9iZQJjisJEf5SkmaykYUuoZK8eKEcV7qXffinsLF0j9Zt-X5mzPaKj5rqSRAQ2LFu8v3mnaXfJm3GVHB-j8V_AQdBGh_TLUitiezB1ZoqJaQhwwicxpH/s320/Trigger-Event1.jpg" width="320" /></a></div>
Se nos ha planteado la posibilidad que indicar quién y qué es lo que se cambia en una serie de tablas.<br />
Sabía desde hace tiempo que el driver rdd de sixdrive permite introducir un trigger para controlar el contenido.<br />
<br />
Pero nosotros usamos DBFNTX, y no podemos cambiar así como así el sistema de RDD.<br />
Por suerte para nosotros, la gente de Harbour le dio soporte también a los NTX.<br />
<br />
Hemos diseñado un sistema de tablas, log y logid, que determina que tablas hacermos logs, y el campo de la PK, para encontrar los cambios de un registro de una tabla determinada.<br />
<br />
La estructura de la tabla LOG;<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
TABLA: Nombre de la tabla que se modificado un valor<br />
ID_VALUE: El valor que usaremos de relación, debería ser una PK<br />
CAMPO: El campo de la dbf se está modificando<br />
NEW_VALUE: Nuevo dato en el dbf<br />
OLD_VALUE: Valor que tenia.<br />
CODUSU, IP, HOSTNAME, FECHA, HORA; Datos de control para saber quien hizo y el cambio y desde donde.<br />
<br />
Después , tenemos otra tabla LOGID, que determinará que TABLA vamos a auditar, en este caso, tenemos una especie de DBU integrado que necesitamos control de todas las tablas, porque como veremos , simplemente se activa en la apertura de la tabla si queremos que se disparen los triggers o no,y cual es el campo de la tabla que queremos que se guarde en el ID_VALUE de la tabla LOG.<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
<br />En el ejemplo que veremos, simplemente he sustituido la tabla LOGID, por un Hash, en la llamada a la función __GetIdLog(), en mi código, simplemente abro la tabla logid, y creo el hash.<br />
<br />
También, en el ejemplo, evito introducir los nuevos registros, y los campos que sean iguales, tampoco se guardarán. Esto programarlo como queráis, la imaginación es solamente vuestra meta ;-)<br />
<br />
Despues, si estamos en un cliente, por ejemplo , donde la PK es el DNI y usamos el DNI como ID a la hora de guardar el log, simplemente haciendo un SCOPE de la tabla + el DNI del cliente, obtendremos todos los cambios aplicados a ese registro ;-)<br />
<br />
Este ejemplo lo podéis ejecutar en el directorio de \harbour\tests, y usa la tabla test.dbf con<br />
<b>hbmk2 trigger.prg hbct.hbc xhb.hbc </b><br />
<br />
<b> </b><br />
Lo he modificado simplemente para que veais la salida a un fichero de log, <b>audit.log </b><br />
<br />
<span style="font-size: x-small;">2016-08-12 12:38:53 -- trigger start -- <br />2016-08-12 12:38:53 INFO: Ejemplo de auditar cambios a traves de triggers.<br />2016-08-12 12:38:53 INFO: <b>TABLE</b>:TEST <b>FIELD</b>:FIRST <b>ID VALUE</b>:Homer Simpson <b>OLD</b> <b>VALUE</b>:Homer <b>NEW VALUE</b>:Homer_TEST <b>DATETIME</b>:20160812123853989 <b>HOSTNAME</b>:NEO64<br />2016-08-12 12:38:54 INFO: <b>TABLE</b>:TEST2 <b>FIELD</b>:LAST <b>ID VALUE</b>: 99700 <b>OLD VALUE</b>:Dysert <b>NEW</b> <b>VALUE</b>:Dysert_TEST <b>DATETIME</b>:20160812123854031 <b>HOSTNAME</b>:NEO64<br />2016-08-12 12:38:54 INFO: <b>TABLE</b>:TEST2 <b>FIELD</b>:NOTES <b>ID VALUE</b>: 99700 <b>OLD VALUE</b>:This is a test for record 500 <b>NEW VALUE</b>:Changes everything <b>DATETIME</b>:20160812123854055 <b>HOSTNAME</b>:NEO64<br />2016-08-12 12:38:54 -- trigger end -- El resultado del ejemplo es este;</span><br />
<br />
<br />
<br />
A continación el codigo fuente;<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>ES</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Tabla normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0cm;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-fareast-language:EN-US;}
table.MsoTableGrid
{mso-style-name:"Tabla con cuadrícula";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-priority:39;
mso-style-unhide:no;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-fareast-language:EN-US;}
</style>
<![endif]-->
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 424.7pt;" valign="top" width="566">
<div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;">
<span style="font-family: "Courier New", Courier, monospace; font-size: x-small;">#include "Hblog.ch"<br />#include "dbinfo.ch"<br />#include "hbsix.ch"<br /><br />//REQUEST DBFNTX<br /><br />Function Main()<br /> <br /> setmode( 25,80 )<br /><br /> rddsetdefault( 'DBFNTX' ) // Forzamos RDD por defecto de HARBOUR<br /><br /> /* Activa log */<br /> INIT LOG FILE( NIL, "audit.log", 1000, 999 ) // Tamaño a 100K y maximo 999 ficheros<br /> LOG "Ejemplo de auditar cambios a traves de triggers."<br /><br /> /* Activar triggers*/<br /> rddInfo( RDDI_TRIGGER, "SX_DEFTRIGGER", "DBFNTX" )<br /><br /> /*Llamar antes de abrir la tabla que queremos controlar*/<br /> sx_SetTrigger( TRIGGER_PENDING, "_trigger", "DBFNTX" )<br /> USE "TEST" NEW SHARED <br /><br /> /* O podemos hacer de esta manera*/<br /> USE TEST ALIAS "TEST2" NEW SHARED TRIGGER "_trigger"<br /><br /> Select TEST<br /> go top<br /> if rlock()<br /> replace FIRST with alltrim( field->FIRST ) + "_TEST"<br /> unlock<br /> commit<br /> endif<br /><br /><br /> Select TEST2<br /> go bottom<br /> if rlock()<br /> replace LAST with alltrim( field->LAST ) + "_TEST"<br /> replace NOTES with "Changes everything"<br /> unlock<br /> endif<br /><br /><br /> CLOSE LOG<br /> CLOSE ALL<br /><br />Return 0<br /><br /><br />function _trigger( nEvent, nArea, nFieldPos, xTrigVal )<br /> Local xIdValue, xValue, cIdValue<br /> <br /> DO CASE<br /><br /> CASE nEvent == EVENT_PREUSE<br /> CASE nEvent == EVENT_POSTUSE<br /> CASE nEvent == EVENT_UPDATE<br /> CASE nEvent == EVENT_APPEND<br /> CASE nEvent == EVENT_DELETE<br /> CASE nEvent == EVENT_RECALL<br /> CASE nEvent == EVENT_PACK<br /> CASE nEvent == EVENT_ZAP<br /> CASE nEvent == EVENT_PUT <br /><br /> if empty( cIdValue := __GetIdLog( ALIAS( nArea ) ) ) // Si no viene expresion, no controlaremos el log<br /> return .T.<br /> endif <br /> Sx_SetTrigger( TRIGGER_DISABLE )<br /> <br /> if FieldType( nFieldPos ) = "C" // Solo en caso de cambios de Caracter, igualamos tamaño <br /> xValue := (nArea)->( FieldGet( nFieldPos ) ) <br /> xTrigVal := padr( alltrim( xTrigVal ), FieldSize( nFieldPos ) )<br /> else<br /> xValue := (nArea)->( FieldGet( nFieldPos ) ) <br /> endif<br /><br /> if xTrigVal != xValue<br /> xIdValue := cValtoChar( &( cIdValue ) )<br /> if !empty( xIdValue ) // Si hay algún valor, se guarda, en registros nuevos, el valor esta vacio, no hay que dejar log<br /> LOG " TABLE:" + ALIAS( nArea ) +;<br /> " FIELD:" + (nArea)->( FieldName( nFieldPos ) ) +;<br /> " ID VALUE:" + xIdValue +;<br /> " OLD VALUE:" + alltrim( cValtoChar( (nArea)->( FieldGet( nFieldPos ) ) ) ) +;<br /> " NEW VALUE:" + alltrim( cValtoChar( xTrigVal ) )+;<br /> " DATETIME:" + hb_ttos( hb_datetime() ) +;<br /> " HOSTNAME:" + netname()<br /> endif <br /> endif<br /><br /> sx_SetTrigger( TRIGGER_ENABLE )<br /><br /> CASE nEvent == EVENT_GET<br /><br /> CASE nEvent == EVENT_PRECLOSE<br /><br /> CASE nEvent == EVENT_POSTCLOSE<br /><br /> CASE nEvent == EVENT_PREMEMOPACK<br /><br /> CASE nEvent == EVENT_POSTMEMOPACK<br /><br /> ENDCASE<br /><br /> Return( .T. )<br /><br />/*<br /> Devuelve el ID a usar segun la tabla.<br /> hLogId es un hash que contiene la tabla y el valor de una expresion de esa tabla que usaremos <br /> para identificar el registro en el log.<br /> Generalmente, se debe usar un PK, una clave única.<br />*/<br />static function __GetIdLog( cTable )<br /> Local cId <br /> static hLogId := { "TEST" => "FIRST + LAST", "TEST2" => "SALARY"}<br /><br /> hb_default( @cTable, "" )<br /> <br /> cId := HB_HGetDef( hLogId, cTable, "" ) <br /><br />return cId<br /><br />function cValToChar( u ); return CStr( u )</span> </div>
</td>
</tr>
</tbody></table>
<br />
<div class="MsoNormal">
<br /></div>
<br />
<br />Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-25790732938121387852016-08-08T03:52:00.000-07:002016-08-08T03:52:08.259-07:00Un poco de protección contra CrytoLocked<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHLcvJiWsl39NMPfJNjC1r3wn6_ozqmiXSrr7kDZaEDWYI-Qvu7rJ3mcVt7H8mwM0xuUA1CowAXjS6_5lJzCSsFbI-MxONa1OJiOSDPX8Fh6YJcm-LEQH-9-uXC7tuAp6p_9oLhKML6ESt/s1600/cryptolocker.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHLcvJiWsl39NMPfJNjC1r3wn6_ozqmiXSrr7kDZaEDWYI-Qvu7rJ3mcVt7H8mwM0xuUA1CowAXjS6_5lJzCSsFbI-MxONa1OJiOSDPX8Fh6YJcm-LEQH-9-uXC7tuAp6p_9oLhKML6ESt/s1600/cryptolocker.jpg" /></a></div>
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">En nuestras aplicaciones que usamos DBF, estamos viviendo un calvario con el tema del CrytoLocked, que como sabéis, lo que hace es cifrar nuestros datos, haciendo datos imposibles de recuperar.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Hay muchas variantes, pero básicamente, a día de hoy, se basan en buscar extensiones de archivos.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Y , desgraciadamente, los ficheros .DBF están es la lista.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Una manera simple es cambiar la extensión en nuestras aplicaciones.</span><br />
<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">cOldExt := hb_rddInfo( RDDI_TABLEEXT, ".app" ) </span></b><br />
<br /><span style="font-family: Arial,Helvetica,sans-serif;">Ahora, cuando usemos una tabla , por ejemplo de clientes;</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">USE CLIENTES NEW SHARED</span><br />
<br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Buscará el fichero <b>"CLIENTES.APP" ;-)</b></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Además, todas las funciones y comandos relacionados con el tema de ficheros no nos deberíamos de preocuparnos.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Es la diferencia de pasar la extensión en cada función o comando, como por ejemplo:</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><b>USE ("CLIENTES.APP") NEW SHARED</b></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b> </b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Para saber que extensión esta activa usaremos la función;</span><br />
<span style="font-family: "Courier New",Courier,monospace;"><b>dbInfo( DBI_TABLEEXT )</b></span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial, Helvetica, sans-serif;">Podéis ver opciones a través del fichero de cabecera, <b>DBINFO.CH</b></span><b> </b></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><b>Header file for the RDD API Index OrderInfo and DBInfo support </b></span>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-4028204193867622022016-08-03T04:13:00.001-07:002016-08-03T04:13:41.826-07:00Threads. Harbour & xBase++<div style="text-align: center;">
<img alt="" height="285" src="data:image/png;base64,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" width="400" /> </div>
Mirando más ejemplos en Harbour, he visto como Przemyslaw, a creado una clase Thread,<br />
que la podéis localizar en <b>/contrib/hbxpp/tthreadx.prg , </b>para manejar los threads igual que<br />
xBase++<br />
<br />
En Internet, he localizado un documento en inglés,<a href="https://donnay-software.com/ds/Articles/Donnay_MultiThreading.Pdf">MultiThreading xBase++</a><br />
<br />
He realizado un simple ejemplo del documento, y funciona perfectamente en Harbour<b>,</b><br />
para compilar<b> hbmk2 test_xbase.prg -mt hbxpp.hbc</b><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"> </span></span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">#include "hbthread.ch"<br /><br />FUNCTION Main()<br /> LOCAL oThread, lThread1Active := .f., lThread2Active := .f.<br /> <br /> oThread := Thread():new()<br /> Sleep(1)<br /> oThread:start({||ThreadLoop( @lThread1Active) } )<br /><br /> oThread := Thread():new()<br /> Sleep(1)<br /> oThread:start( {||ThreadLoop( @lThread2Active ) } )<br /><br /> DO WHILE lThread1Active .OR. lThread2Active<br /> Sleep(1)<br /> ENDDO<br /> WAIT<br /><br />RETURN nil<br /><br />STATIC FUNCTION ThreadLoop( lActive )<br /> LOCAL i<br /> lActive := .t.<br /><br /> FOR i := 1 TO 5<br /> ? 'I am running in thread ' + Alltrim(Str(hb_ThreadId()))<br /> hb_idleSleep(1.5)<br /> NEXT<br /><br /> lActive := .f.<br /> <br />RETURN nil</span></span><b><br /></b><br />
Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-42409796232501177172016-08-01T04:41:00.000-07:002016-08-01T04:41:21.179-07:00PDF. Threads en Harbour.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRCfbnqScI67yGutCQNC84DOOQyOkZgflN9YUQcynt5LDiyriM62EgLIe9KhmKQAGfPjyq7X9oq0tWqy9X4lqAu2OfsQubVSJNB-WNnREwW9T1I1cXudNz1-_QxywvjMHd6Lh0Fq3BZUch/s1600/pdf_download-150x150.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRCfbnqScI67yGutCQNC84DOOQyOkZgflN9YUQcynt5LDiyriM62EgLIe9KhmKQAGfPjyq7X9oq0tWqy9X4lqAu2OfsQubVSJNB-WNnREwW9T1I1cXudNz1-_QxywvjMHd6Lh0Fq3BZUch/s1600/pdf_download-150x150.png" /></a></div>
<br />
Esta entrada es simplemente para que tengais el PDF. <a href="https://drive.google.com/file/d/0B_wIHC343Y8YRW5aYWxaUG5hZjA/view?usp=sharing">Threads en Harbour</a><br />
<br />Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-41236892731229351922016-07-29T02:09:00.000-07:002016-07-29T02:09:07.513-07:00NOTAS FINALES de Threads en Harbour<b id="docs-internal-guid-422bcd5a-279b-904b-6286-d8803aff5bf5" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-279b-904b-6286-d8803aff5bf5" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Todo lo bueno tiene un final, y esta serie sobre threads en Harbour llega a su fin.</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-279b-904b-6286-d8803aff5bf5" style="font-weight: normal;"><b><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Espero que os haya sido ameno y entrenido, tanto como yo en escribirlo.</span></b></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-279b-904b-6286-d8803aff5bf5" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Es importante ver los ejemplos de Harbour, son muy ilustrativos , aunque para los que no estamos acostumbrados, pueden ser un poco lioso al inicio</span></b></div>
<b id="docs-internal-guid-422bcd5a-279b-904b-6286-d8803aff5bf5" style="font-weight: normal;"><br /></b><b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;"></b>
<br />
<h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt; text-align: center;">
<b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 26.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Listado de ejemplos de Harbour</span></b></h1>
<b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest1.prg</span></b></div>
<b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;">
</b>
<ul style="margin-bottom: 0pt; margin-top: 0pt;"><b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra el uso como detached local y valores complejos usando un thread</span></div>
</li>
</b></ul>
<b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;">
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest2.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra el uso del comando QUIT y el estamento ALWAYS en ejecución. El thread hijo usa QUITt antes que el principal</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest3.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra el uso del comando QUIT y el estamento ALWAYS en ejecución. El thread main usa QUITt antes que el thread hijo</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest4.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra el uso de variables protegidas y sin proteger</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest5.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra el uso thread static variables</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest6.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Usando variables tipo memvar con hilos</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest7.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ejemplo de uso de Mutex para enviar/recibir mensajes entre hilos.</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest8.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Usando el compartir variables de memoria entre hilos</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest9.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra como usar el mismo alias entre distintos hilos, usando estas 2 funciones </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_dbRequest y hb_dbDetach. </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Nota: </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un regalo de despedida lo tenéis abajo ;-)</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest10.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra una consola por thread mostrando un browse</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest11.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Muestra un ejemplo de un thread asincrono mostrando un reloj</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest12.prg</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Variables a nivel de hilo, pueden ser declaradas como; </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">THREAD STATIC</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">t_Var1</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Esta variable es una variable static por cada hilo creado.</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Mención especial para el código fuente </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/contrib/httpd/core.prg, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">donde podemos ver muchas de estas técnicas explicadas.</span></div>
<br /><b id="docs-internal-guid-422bcd5a-27af-972c-1167-a7d142df8ebb" style="font-weight: normal;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">De regalo ;-)</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Esto fue escrito hace ya 6 años para un sistema para hacer una indexación multihilo, aunque en la mayoría de los casos existe penalización por tema de velocidad de disco, es bueno saber COMO se podria hacer.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En más de 1000 servidores diferentes hemos encontrado que un máxima de 5 hilos por</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">tabla y un índice a la vez, la ganancia es sustancial en un sistema monolítico.</span></div>
</b></b><b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;"><b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;"><b><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b></b></b><br />
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/*</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Example multiThreads index.</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> One thread by table , and one thread by index.</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> 2010 Rafa Carmona</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Thread Main</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> |---------> Thhread child table for test.dbf</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> | |----> Thread child index fname</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> | |</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> | |----->Thread child index fcode</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> |</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> |---------> Thhread child table for test2.dbf</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> |----->Thread child index fname2</span></div>
<br />
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> */</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#include "hbthread.ch"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc Main( uCreate )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local nSeconds</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local aFiles := { "test", "test2" } // Arrays files dbf</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local aNtx := { { "fname", "fcode" },; // files index for test</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> { "fName2" } } // files index for test2</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local aExpr := { { "name", "code" },;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> { "dtos(fecha)+str(code)" } } // Expresions</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local cDbf</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if empty( lCreate )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> lCreate := "0"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> setmode( 25,80 )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if uCreate = "1"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Create test.dbf and test2.dbf"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> dbCreate("test",{ {"name","C",1,0 },{"code","N",7,0 } } )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> use test</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> while lastRec() < 1000000</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> dbAppend()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> field->name := chr( recno() )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> field->code := recno()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> enddo</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> close</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> dbCreate("test2",{ {"fecha","D",8,0 },{"code","N",7,0 } } )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> use test2</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> while lastRec() < 1000000</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> dbAppend()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> field->fecha := date() + recno()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> field->code := recno()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> enddo</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> close</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> // Threads</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> nSeconds := Seconds()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for each cDbf in aFiles</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Process.: " + cDbf</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @aCreateIndexe(), cDbf, aNtx[ cDbf:__enumindex ],</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">aExpr[ cDbf:__enumindex ], cDbf:__enumindex )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Wait for threads ...."</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadWaitForAll()</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? hb_valTostr( Seconds() - nSeconds )</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "finish"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">function aCreateIndexe( cFile, aNtx, aExpr, nPosDbf )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local nContador := 1</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local cFileNtx, cExpr</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local nLong := Len( aNtx )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local aThreads := {}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local cAlias</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> use ( cFile )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cAlias := alias()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_dbDetach( cAlias ) // Libero el alias</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for each cFileNtx in aNtx</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cExpr := aExpr[ cFileNtx:__enumindex ]</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> nContador := 1</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> nPos := cFileNtx:__enumindex</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aadd( aThreads, hb_threadStart( @crea(), cAlias,cExpr,</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">cFileNtx, nPos, nPosDbf ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aEval( aThreads, { |x| hb_threadJoin( x ) } ) // wait threads childs</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_dbRequest( cAlias, , , .T.) // Restaura el alias</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> close</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">RETURN NIL</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc crea( cAlias, cExpr, cFileNtx, nPos, nPosDbf )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local nContador := 1</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_dbRequest( cAlias, , , .T.) // Restaura el alias</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> INDEX ON &(cExpr) TO &(cFileNtx) ;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> EVAL {|| hb_dispOutAt( nPosDbf, iif( nPos = 1, 20, 40 ),</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">alltrim( hb_valtostr( nContador) ), "GR+/N" ), nContador += INT(</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">LASTREC() / 100 ) , .T. } ;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> EVERY INT( LASTREC() / 100 )</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_dbDetach( cAlias ) // Libera el alias</span></div>
<br />
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return </span></div>
</td></tr>
</tbody></table>
</div>
<b id="docs-internal-guid-422bcd5a-27a1-43a7-0971-8b8826a219b4" style="font-weight: normal;"><br /></b>
Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-73712323201485642662016-07-29T02:08:00.000-07:002016-07-29T02:08:20.603-07:00Sincronización de Threads. Subscribe & Notify<b id="docs-internal-guid-422bcd5a-2798-d54a-6e35-577778b64286" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-422bcd5a-2798-d54a-6e35-577778b64286" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Subscribe & Notify</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2798-d54a-6e35-577778b64286" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img height="248" src="https://lh5.googleusercontent.com/E-jtr-_Q-HxfEzV2lPxpGtSHtCFoVDgh2HdZ7G4aiSLCfKKNqUWrItgkbFF-e57d9gync3LbWgfBJKmIVWaxlL3jlQ8V1Lv0uy0gwBFw7WXyMaQM48Tnvn1AYULTQwejrvmCNXy0" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602" /></span></b></div>
<b id="docs-internal-guid-422bcd5a-2798-d54a-6e35-577778b64286" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2798-d54a-6e35-577778b64286" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Anteriormente vimos un mutex trabajando como un semáforo, ahora veremos que es eso de la suscripción de mensajes.</span></b></div>
<b id="docs-internal-guid-422bcd5a-2798-d54a-6e35-577778b64286" style="font-weight: normal;">
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexSubscribe</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pMtx>, [ <nTimeOut> ] [, @<xSubscribed> ] ) -> <lSubscribed></span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Dentro de un thread, suscribimos el thread para ser avisado por una notificación, que lógicamente, vendrá desde otro hilo distinto, por lo tanto , </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexSubscribe </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">y </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexNotify </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">corren en hilos distintos, y lo que comparten en común es un mutex., <pMtx>.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si hay notificaciones pendientes, continua la ejecución del thread, si no, estará suspendido a la espera de una notificación, que puede especificar cuantos segundos esperaremos a ser</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">notificados, <nTimeOut>, por defecto, se queda indefinidamente.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En la variable pasada por referencia, @<xSubscribed>, vamos a obtener el valor que nos</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">envía desde la notificación. Retorna si tuvo éxito la subscripción al mutex o no, <lSubscribed></span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexSubscribeNow</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pMtx>, [ <nTimeOut> ] [, @<xSubscribed> ] ) -> <lSubscribed></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El funcionamiento es similar </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexSubscribe, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">la única diferencia es que antes de comenzar, borra todas las notificaciones pendientes.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Antes de ver un par de ejemplos, vamos a seguir explicando con </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexNotify.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexNotify</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pMtx> [, <xVal>] ) -> NIL</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Emite una notificación a todos los threads esperando que están suscritos al mutex, <pMtx>.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Pero, por cada notificación sólo uno de los threads responderá, por lo tanto, tendremos que ir</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lanzando notificaciones para que diferentes threads vayan respondiendo.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si no hay threads a la espera, se van quedando en una cola, que serán enviados conforme se vayan suscribiendo los threads que queramos.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Podemos enviar un parámetro , <xVal>, que como dijimos posteriormente, será recibido por la variable pasada por referencia en </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexSubscribe,</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> @<xSubscribed> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A tener en cuenta que no existe ningún tipo de relación entre el orden de suscripción y el orden de notificación.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Hay un ejemplo de esto en </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/contrib/mt/mttest07.prg </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> donde podéis observar lo aquí explicado, y aunque es ‘duro’ de entender si no sabemos nada, os pongo una versión ‘modificada’ con anotaciones y con pausas, para poder observar que está realizando y observar el comportamiento para intentar asimilarlo con tranquilidad ;-)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En el ejemplo de Harbour, podéis observar como se autoalimentan el hijo del padre y el padre del hijo a través de 2 mutex.</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#define N_THREADS 2</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#define N_JOBS 5</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">static s_mtxJobs, s_Result := 0</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local aThreads, i, nDigit</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Main start"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aThreads := {}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_mtxJobs := hb_mutexCreate()</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Arrancamos Thread. "</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Cuando se arranquen los hilos, estos estaran suspendidos a la espera"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "de la notificacion"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Pulsa una tecla para continuar"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> inkey( 0)</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for i := 1 to N_THREADS</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Thread <" + hb_ntos( i ) + ">"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aadd( aThreads, hb_threadStart( @thFunc() ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Pulsa tecla para empezar a enviar Notificaciones" </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "En cada Notificacion, veras que se ejecuta <Run Thread by Nofify> que" </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "parte debajo de hb_mutexSubscribe en la funcion thFunc()"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? ""</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> inkey(0)</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> nDigit := 1</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for i := 1 to N_JOBS</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Notifica Job: <" + hb_ntos( i ) + "> Pulsa una tecla para continuar"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexNotify( s_mtxJobs, nDigit )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> inkey( 0 )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> nDigit++</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Ahora vamos a enviar NIL, para salir del bucle while de la funcion thFunc()."</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for i := 1 to N_THREADS</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexNotify( s_mtxJobs, NIL )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> //?? "<" + hb_ntos( i ) + ">"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Esperando a los threads..."</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aEval( aThreads, {| x | hb_threadJoin( x ) } )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Threads se unieron al principal"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Value Total:", s_Result</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "End of main"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc thFunc()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local xJob</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> while .T.</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Thread Subscribe: " + "0x" + hb_NumToHex( hb_threadSelf() )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexSubscribe( s_mtxJobs,, @xJob )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Run Thread by Nofify"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if xJob == NIL</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ?? "..... exit thread......."</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> exit</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> // Si no protejo la variable, el valor final puede tener un valor inesperado</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexLock( s_mtxJobs )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_Result += xJob </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexUnLock( s_mtxJobs )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> enddo</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
</td></tr>
</tbody></table>
</div>
<br /><br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexNotifyAll</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pMtx> [, <xVal>] ) -> NIL</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Emite una notificación a todos los threads que estén a la espera.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si no hay threads, no se ejecuta funcion alguna, no se agregan ni se quitan notificaciones que estuviesen en la cola.</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#define N_THREADS 5</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">static s_mtxJobs</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local aThreads, i</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Main start"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aThreads := {}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_mtxJobs := hb_mutexCreate()</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for i := 1 to N_THREADS</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aadd( aThreads, hb_threadStart( @thFunc() ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Ahora vamos a enviar notificacion a todos los hilos."</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> inkey( 1 )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexNotifyAll( s_mtxJobs )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Esperando a los threads..."</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aEval( aThreads, {| x | hb_threadJoin( x ) } )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Threads se unieron al principal"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "End of main"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc thFunc()</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Thread Subscribe: " + "0x" + hb_NumToHex( hb_threadSelf() )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexSubscribe( s_mtxJobs )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Run Thread by Nofify & dead " + "0x" + hb_NumToHex( hb_threadSelf() )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br /></td></tr>
</tbody></table>
</div>
<br /><br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Y por último, vemos esta función;</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexEval</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pMtx>, <bCode> | <@sFunc()> [, <params,...> ] ) -> <xCodeResult></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Aparentemente, lo que hace es ejecutar un codeblock , protegiendo el contenido entre hilos.</span></div>
</b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-57501905355021136272016-07-28T00:23:00.003-07:002016-07-28T00:23:54.729-07:00Mutex.<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">MUTEX</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img height="255" src="https://lh3.googleusercontent.com/Z92ylznh9LUf2HPPw9lPcCOJ_PkV7O7DVl15xcyWwXJ-zpNIs1FCDJJ9Gyt5_H3hCWE0Q1clRteh_AI_FR92hkEFJ-5DZ-7BeowsGWfNumh6WtshBrzZBQrD2WPQlzsqQsE6UlUb" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602" /></span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">¿ Que es un mutex ?</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En un proceso concurrente, el acceso a compartir datos puede llegar a crear inconsistencia de datos. Para evitarlo usaremos unos mecanismos que nos va a permitir modificar datos de manera consistente. Ver </span><a href="https://es.wikipedia.org/wiki/Exclusi%C3%B3n_mutua_(inform%C3%A1tica)" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Exclusión Mutua</span></a></b></div>
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexCreate</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() -> <pMtx></span></b></div>
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;">
</b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Crea un mutex , que podemos usarlo como semáforo o para suscripción de mensajes.</span></b></div>
<b id="docs-internal-guid-cdf4ce7f-2623-f1b8-0dce-768a7242e2de" style="font-weight: normal;">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">De momento, vamos a usarlo como semáforo, que por cierto, desde aquí un tributo a quién lo inventó, </span><span style="background-color: white; color: #252525; font-family: "arial"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><a href="https://es.wikipedia.org/wiki/Edsger_Dijkstra" style="text-decoration: none;"><span style="background-color: white; color: #0b0080; font-family: "arial"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Edsger Dijkstra</span></a><span style="background-color: white; color: #252525; font-family: "arial"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> en 1965!!!</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><a href="https://es.wikipedia.org/wiki/Sem%C3%A1foro_(inform%C3%A1tica)" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Semáforo ( Informática )</span></a></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lo que nos devuelve es un puntero que usaremos posteriormente.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexLock</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pMtx> [, <nTimeOut> ] ) -> <lLocked></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Simplemente lo que haces al llamar a </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexLock() </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">es establecer un bloqueo en el Thread. Si el mutex se encuentra bloqueado por otro thread, el thread actual queda a la espera de que se termine el bloqueo, así, cuando el Mutex vuelva a estar disponible,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">solo unos de los threads obtendrá acceso, mientras que los demás threads seguirán esperando. </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">nTimeOut</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, indica la cantidad de segundos que estaremos esperando para conseguir el bloqueo, por defecto , lo intentará indefinidamente.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexUnlock</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pMtx> ) -> <lOK></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Desbloquea Mutex y lo deja para que otro thread lo pueda bloquear.</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#include "hbthread.ch"</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">STATIC s_hMutex </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_hMutex := </span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexCreate</span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">()</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @EscribeLog(), "Thread A" )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @EscribeLog(), "Thread B" )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @EscribeLog(), "Thread C" )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @EscribeLog(), "Thread D" )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Salimos"</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadWaitForAll()</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc EscribeLog( cText )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> static n := 0</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> /* El que bloquea, escribe e incrementa n */</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if </span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexLock</span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( s_hMutex )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? cText , ++n</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexUnLock</span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( s_hMutex )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif </span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return </span></div>
</td></tr>
</tbody></table>
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Hay que tener especial cuidado que es lo que bloqueamos. Por ejemplo, realizar esto;;</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">if bb_mutexLock</span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( s_hMutex )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Funcion_que_tarda_un_monton() </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_mutexUnLock</span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( s_hMutex )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">endif</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Toda la magia de los threads se pierde. Es como si al querer modificar un registro de una tabla, bloqueamos TODA LA TABLA, ¿ Verdad que no tiene sentido ?</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Hay que ser cuidadoso, pero como podéis ver, tampoco es tan tan complicado.</span></div>
<br /><br /><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Siguiente:</span><span style="font-family: "arial";"><b>Subscribe & Notify</b></span></b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-81627298677159400872016-07-28T00:23:00.001-07:002016-07-28T00:23:14.508-07:00Terminar Threads<b id="docs-internal-guid-cdf4ce7f-2623-0e4b-ddd6-77ce9677c79a" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-cdf4ce7f-2623-0e4b-ddd6-77ce9677c79a" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Terminar Threads</span></b></div>
<b id="docs-internal-guid-cdf4ce7f-2623-0e4b-ddd6-77ce9677c79a" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-cdf4ce7f-2623-0e4b-ddd6-77ce9677c79a" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadQuitRequest</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pThID> ) -> <lOK></span></b></div>
<b id="docs-internal-guid-cdf4ce7f-2623-0e4b-ddd6-77ce9677c79a" style="font-weight: normal;">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Intenta ‘matar’ el hilo pasado pThID. Devuelve .T. si lo consigue.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Aunque se aconseja que los hilos terminen limpiamente, es decir, una vez lanzado, </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">debe de finalizar por si mismo.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadTerminateAll</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() -> NIL</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Manda un mensaje de salida a todos los threads en ejecución y espera que terminen.</span></div>
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Solo se debe de llamar desde el thread principal, aunque , esto no debería usarse.</span></b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-76670781265126857992016-07-28T00:22:00.001-07:002016-07-28T00:22:51.647-07:00Varias funciones de Threads<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b></div>
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
</div>
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadSelf</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">() -> <pThID> | NIL</span></b></div>
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Devuelve Id del hilo donde estoy, incluido el principal.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadID</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( [ <pThID> ] ) -> <nThNo></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Devuelve el número de thread según pThID. Si no se pasa, devuelve el actual.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En la librería </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">xhb</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, la que hace compatibles varias funciones de xHarbour para Harbour,</span></div>
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">en el fichero </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">contrib/xhb/xhbmt.prg </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, tenéis disponibles los wrappers para la gente de xHarbour.</span></b><br />
<span style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Puede ser que los threads en xharbour existe algunas diferencias, please, revisar documentación.</span></span><br />
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b id="docs-internal-guid-422bcd5a-2621-aedc-221e-afc2232cb457" style="font-weight: normal;"><br /></b></span></b>
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HARBOUR</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">XHARBOUR</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadStart</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">StartThread</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexSubscribe</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Subscribe</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexSubscribeNow</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">SubscribeNow</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Comprobar hb_threadID()</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">IsSameThread</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Compobar hb_threadID()</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">IsValidThread</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadQuitRequest</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">KillThread</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadQuitRequest( pThID )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadJoin( pThID )</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">StopThread</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_idleSleep( nTimeOut / 1000 </span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">ThreadSleep</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexLock</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_MutexTryLock</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mutexLock</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_MutexTimeOutLock</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">iif( PCount() < 1, hb_threadID(), hb_threadID( pThID ) )</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">GetSystemThreadId</span></div>
</td></tr>
</tbody></table>
</div>
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><b id="docs-internal-guid-422bcd5a-2621-aedc-221e-afc2232cb457" style="font-weight: normal;"><br /></b> </b><br />
<br />
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<b id="docs-internal-guid-75439113-2619-b7fa-5437-653716dbc364" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-21607642028911051102016-07-27T04:06:00.004-07:002016-07-27T04:06:54.268-07:00win_ReportEvent. Guardar eventos en el sistema de Windows.<br />
<br />
<h2 style="text-align: center;">
<span style="font-family: Arial,Helvetica,sans-serif;"> Guardar eventos en el sistema de Windows.</span></h2>
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Mi buen amigo Jose Luis Capel, me preguntó si Harbour es capaz de guardar en el sistema de eventos.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Pues mira tu por donde, en el directorio <b>contrib/hbwin/test/eventlog.prg</b> tienes la clave ;-)</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">#require "hbwin"<br /><br />PROCEDURE Main()<br /><br /> ? win_ReportEvent( NIL, "Application", WIN_EVENTLOG_SUCCESS, 0, 0, "hello" )<br /> ? win_ReportEvent( NIL, "Application", WIN_EVENTLOG_SUCCESS, 0, 0, { "hello", "world" } )<br /><br /> RETURN</span> </span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial, Helvetica, sans-serif;">Paso pantallazo donde consultarlo y la ultima puedes ver el<b> hello world.</b></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"> </span><br />
<br />
<br />
<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAAM/CAIAAADzzygrAAAgAElEQVR4nOy9eXgU153328/73vs+z5s7d7Z7ncky9s04yczEmcWxndgt+43tJF6y+B0nsU0mk8QY7IohtmOEMYhF0AKJTdBCQkYLu2mwZZlFWCUQSEIgJNQINdpArZKEJBbRgDBCCGG0nPtHdVedqjpVXSV1q7ul7+f5PdCqPltVV5063/r9zimbIAjNzc1nzpxpbGxsaGioq6vzeDwej6e2tvbUqVM1NTUnT550u91ut7saVFdXV1d/9atfvffee++7774vf/nLL7zwwtNPP/3UU0/98Ic/fOKJJx5//HG73f7YY499+ctf/s53vvPd7373X/7lX5599tkFCxYsWbLEYY7FixcvXLhw7ty5b7755ooVKwoKCvbs2fMx0GHPnj0FBQUrV66cMWPGvHnzFi1aJB3qpADin0uWLFm0aNG8efNmzJixcuXKWD+w0o7PnDkzISEhMTFR2uWlAaTdT0xMTEhImDlz5gTY8VFAH6v58+eLx0o8RMsCiH+Kx2r+/PkT9ViJh2LVqlV/+tOf5s+fv3jx4qSkJPEIJAcQ/0xKSlq8ePH8+fP/9Kc/rVq1auIdChHpgLz11ltiR7106VLxOKQEEP9cunTpkiVLFixY8NZbb03gAxIU80csKSlp0aJFc+fOnTp1anZ2dnt7+zlw7lx7e3t2dvbUqVPnzp27aNGipKQknG8f40oEMYKtubm5qampvr7e4/GcOnXq5MmT1dXVJ06cqKqqqqysrKysPH78eEVFRUVFxTFw7NixY8e++tWv/v3f//299957zz33/PznP3/yySdFyRQXF2e32x999NEf/OAH99xzzz//8z8/8MADDzzwwE9+8pO5c+cuXLhwkQkWLlyYkJAwZ84cjuPmzJmTn5+/a9eu7cCQXbt25efnv//++3/84x/ff//9+fPniwczMYD45/z586U0E+PAijsuCuy5c+cuWLBA3OvFAcR9X7BggZRmYuz4KJCO1YwZM8TrUTxQSwKIh0t8YCGmmajHSjoUM2fOFB80iMdBenAjHg3xEcPMmTMn8KEQoQ9IQkKC9OSFfuwiPnMRHz1M+AMSFDNHLDExccGCBXPmzJk6deqiRYuampqaQYCmpqZFixZNnTp1zpw5CxYsoJ95TebzDVciiH5sZ86c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" />Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-36711128652328293812016-07-27T00:22:00.001-07:002016-07-27T00:22:35.803-07:00Esperando a los Threads. hb_threadWaitForAll & threadWait<b id="docs-internal-guid-548de0da-2616-c161-313d-f31c760894d5" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-548de0da-2616-c161-313d-f31c760894d5" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadWaitForAll</span></b></div>
<b id="docs-internal-guid-548de0da-2616-c161-313d-f31c760894d5" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-548de0da-2616-c161-313d-f31c760894d5" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La función </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadWaitForAll</span><span style="background-color: white; color: #212121; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( ) sólo es eficaz cuando se le llama en el hilo principal de la aplicación.</span></b></div>
<b id="docs-internal-guid-548de0da-2616-c161-313d-f31c760894d5" style="font-weight: normal;">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: #212121; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lo que hace es suspender el hilo principal hasta que el resto de hilos en ejecución terminen.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: #212121; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En el ejemplo anterior, podemos ver como solucionar el problema anterior;</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#include "hbthread.ch"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_p1 := s_p2 := s_p3 := 0</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Llama"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( hb_threadStart( @p1(), "sin nada" ) )</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Salimos"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadWaitForAll()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc p1( ctext )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local h</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> h := fcreate("test.txt")</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> fwrite( h, ctext)</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> fclose( h )</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
</td></tr>
</tbody></table>
</div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: #212121; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ahora debería estar el fichero con el contenido.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: #212121; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En el caso que explique en el post inicial, sobre la portabilidad de un sistema de mensajes,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: #212121; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">el salir del bucle principal, antes de salir de la aplicación, está la llamada a </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadWaitForAll() </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">para que se terminen los hilos que están en marcha y evitar mensajes sin procesar porque la aplicación ha finalizado.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: #212121; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">¿ Pero , puedo esperar a un hilo en concreto a que termine su tarea ?</span></div>
<br /><br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadWait</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadWait( <pThID> | <apThID>, [ <nTimeOut> ] [, <lAll> ] ) =><nThInd>|<nThCount> 0</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Espera a que se termine</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> pThID</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> pasado , o en su caso, un array de threads</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> apThID.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">nTimerOut indica los segundos que tiene que esperar a que se terminen los threads pasados.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si no pasamos , se espera hasta que todos los threads pasados finalicen si está activado el tercer parámetro </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lAll.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lógicamente , no se usan hilos que están unidos a través de hb_threadJoin.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Devuelve el primer índice del hilo que ha terminado, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">nThInd </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,o si está activado </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lAll</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, la cantidad de hilos que han podido terminar en el periodo de tiempo que hemos establecido, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">nThCount, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">o </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 si no se terminó ninguno.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un ejemplo que muestra esto es el ejemplo de Harbour </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/tests/mt/mttest10.prg</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#include "inkey.ch"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#ifdef __PLATFORM__WINDOWS</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> REQUEST HB_GT_WVT_DEFAULT</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> #define THREAD_GT hb_gtVersion()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#else</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> REQUEST HB_GT_STD_DEFAULT</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> #define THREAD_GT "XWC"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#endif</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main( cGT )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local i, aThreads, n</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if ! hb_mtvm()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "This program needs HVM with MT support"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> quit</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if empty( cGT )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cGT := THREAD_GT</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if cGT == "QTC" .and. ! cGT == hb_gtVersion()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> /* QTC have to be initialized in main thread */</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_gtReload( cGT )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Starting threads..."</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aThreads := {}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for i := 1 to 3</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aadd( aThreads, hb_threadStart( @thFunc(), cGT ) ) </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? i, "=>", atail( aThreads )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> /</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/ RETOCADO, para que muestre el valor de n,</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Waiting for threads"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> while inkey() != K_ESC</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> n := hb_threadWait( aThreads, 0.1, .T. ) </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if n == len( aThreads )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ?? str(n,1)</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> wait</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> exit</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ?? str(n,1)</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> enddo</span></div>
<br />
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc thFunc( cGT )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> /* allocate own GT driver */</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_gtReload( cGT )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> if ! dbExists( "test" ) .and. dbExists( "../test" )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> use ../test shared</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> else</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> use test shared</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> endif</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> browse()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
</td></tr>
</tbody></table>
</div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Este ejemplo es interesante, nos crea 3 hilos con 3 browses sobre la misma tabla , con el mismo alias, y hacer un bucle esperando la finalización de los 3 browses.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si lo ejecutas, y te pones en la consola que muestra lo siguiente;</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img height="201" src="https://lh6.googleusercontent.com/ME8cYHXFvg7C-1QalDXEQcbLt_INRYmDq1OhpmYza_zRlCUnX-ieXHkG115FpVxquq__CxeBAqqwzIhWj0gptgdNr2yy9hLMzKHCqBaPzf1kZLw_JlMzFYuW0xCGbcY5jrRC86SY" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602" /></span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Como vimos, cuando devuelve cero, es que no ha finalizado ningún hilo. Si pulsamos ESC sobre la ventana de un browse, este muere, y nos pinta un 1, indicando ,de qué de los 3 threads que estamos controlando, uno ha terminado.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A continuación, volvemos a matar otro browse, vemos que muestra un 2, indicando que ya son 2 los threads terminados y si volvemos a matar el browse que queda, veremos que ha pintado 3 y sale del bucle.</span></div>
<br /><br /><br /><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Siguiente:<b> Id de Theads.</b></span></b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-55612665183285932672016-07-26T01:23:00.001-07:002016-07-26T01:23:10.267-07:00Separar un thread, hb_threadDetach()<b id="docs-internal-guid-712b01f1-2611-7267-b5fb-e98aced50d8d" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-712b01f1-2611-7267-b5fb-e98aced50d8d" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach</span></b></div>
<b id="docs-internal-guid-712b01f1-2611-7267-b5fb-e98aced50d8d" style="font-weight: normal;"><br /></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-712b01f1-2611-7267-b5fb-e98aced50d8d" style="font-weight: normal;"><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img height="488" src="https://lh5.googleusercontent.com/Cn8ckQPqLUV19Eoh54jUNfvM0m-6pyyTYY6OSzW_hSRnF53hB5oAvH54yTEtPspt_RQW4gD8qRKHLx3Uxc14NyvwLmaTI_GwNftTrw-Nb2sZPaLDR16JC1PBAn5lDXni5xUlQqeA" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602" /></span></b></div>
<b id="docs-internal-guid-712b01f1-2611-7267-b5fb-e98aced50d8d" style="font-weight: normal;">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b id="docs-internal-guid-712b01f1-2611-7267-b5fb-e98aced50d8d" style="font-weight: normal;"></b></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-712b01f1-2611-7267-b5fb-e98aced50d8d" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pThID> ) -> <lOK></span></b></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">¿Qué debo hacer cuando mi hilo no devuelve nada útil, y no tiene que esperar a su finalización? </span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> indica al sistema: Estoy empezando este hilo, pero no estoy interesado en unirse a él. Esta operación se denomina </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">separar un thread</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Las reglas más importantes para unirse( </span><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadJoin) / </span><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">separarse(</span><span style="background-color: white; color: #333333; font-family: "arial"; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ) son:</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">No se una a un thread que ya se ha unido</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">No puede unirse a un thread separado.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si extrae un thread , no se puede "volver a conectarse" al mismo.</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">De todas maneras, no sé exactamente cuál es el propósito del </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">detach en Harbour </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">si llamando a hb_threadStart() realiza la misma función, sin usar Join, al menos, en las pruebas</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">que he realizado no logro ver diferencias entre crear un hilo, y crear un hilo y dejarlo morir y llamar a detach. </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 13.333333333333332px; font-style: italic; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( Si alguien lo sabe, bienvenida explicación )</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un ejemplo, seria poner un reloj o ejecutar un sonido ante un evento, sin importar el resultado.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ahora bien, hay que tener en cuento que los threads pueden no terminar, porque el proceso principal ha terminado, matando los threads pendientes.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En el siguiente código, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">su ejecución va a provocar la creación de un fichero o no, pero ojo,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">puede ser que el contenido esté o no. </span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Esto se debe al separar el hilo con </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, el terminar el proceso principal, hace</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">que el hilo también se acabe, sin terminar su tarea.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El objetivo del ejemplo es mostrar que hace </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lógicamente, el ejemplo no tiene sentido.</span></div>
<br /><br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#include "hbthread.ch"</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_p1 := s_p2 := s_p3 := 0</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Llama"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadDetach</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( hb_threadStart( @p1(), "sin nada" ) )</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Salimos"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc p1( ctext )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local h</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> h := fcreate("test.txt")</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> fwrite( h, ctext)</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> fclose( h )</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
</td></tr>
</tbody></table>
</div>
<br /><br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Entonces, ¿ cómo podemos evitar esta situación ?</span></div>
<br /><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Siguiente: hb_threadWaitForAll()</span></b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-70008155049234654202016-07-25T00:56:00.000-07:002016-07-26T01:22:29.202-07:00Sincronizar Threads, hb_threadJoin()<b id="docs-internal-guid-422bcd5a-2112-76bf-dbea-17863ec1544f" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt; text-align: center;">
<b id="docs-internal-guid-422bcd5a-2112-76bf-dbea-17863ec1544f" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 34.666666666666664px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadJoin</span></b></div>
<b id="docs-internal-guid-422bcd5a-2112-76bf-dbea-17863ec1544f" style="font-weight: normal;">
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadJoin</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <pThID> [, @<xRetCode> ] ) -> <lOK></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bloquea el thread principal, hasta la finalización de pThID.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Se pasa una variable por referencia para obtener la respuesta de la función si fuese necesario.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
</b><b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Una descripción gráfica sería la siguiente, donde la llamada a<b> </b></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b>hb_threadJoin</b> ,<b> </b>para thread1 y thread2 , bloquea el proceso principal, hasta que los 2 threads<b> </b>se hayan realizado.</span></div>
</b><br />
<div style="text-align: center;">
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img alt="" height="400" src="data:image/png;base64,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" width="390" /></span></b></div>
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;">
</b></div>
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b></div>
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;"><br /></b></div>
<b id="docs-internal-guid-422bcd5a-2112-93e7-1860-9d6dd35e1259" style="font-weight: normal;">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2113-598a-72b3-30d2830310bc" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un ejemplo simple es lanzar una serie de hilos para precalcular datos, y esperar<b> </b>a que todos terminen para poder continuar.</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2113-598a-72b3-30d2830310bc" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En este ejemplo, simplemente lo metemos en un for con un delay para ver el efecto en real de lo que hace </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadJoin()</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-422bcd5a-2113-598a-72b3-30d2830310bc" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><b id="docs-internal-guid-422bcd5a-2113-bd8d-4d7f-99eedce6a8a9" style="font-weight: normal;"><br /></b></b></div>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#</span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">include "hbthread.ch"</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">static s_p1, s_p2, s_p3</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local aThreads := {}</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Local oObject := Test():New()</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_p1 := s_p2 := s_p3 := 0</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> AAdd( aThreads, hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @p1() ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> AAdd( aThreads, hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @p2() ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> AAdd( aThreads, hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @p3() ) )</span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> AAdd( aThreads, hb_threadStart( {|| oObject:&("Paint")( "From Harbour" ) } ) )</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> AEval( aThreads, {| h | hb_threadJoin( h ) } )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "Total:", s_p1 + s_p2 + s_p3</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc p1()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local x</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for x := 1 to 5</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_p1 := x</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> DispOutAt( 1, 1, "(Thread 1):"+ Str( x,2 ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_idleSleep( 0.5 )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc p2()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local x</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for x := 1 to 5</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_p2 := x</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> DispOutAt( 2, 1, "(Thread 2):"+ Str( x,2 ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_idleSleep( 0.5 )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc p3()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local x</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for x := 1 to 10</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_p3 := x</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> DispOutAt( 3, 1, "(Thread 3):"+ Str( x,2 ) )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_idleSleep( 0.5 )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#include "hbclass.ch"</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">CLASS TEST</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> METHOD New( ) CONSTRUCTOR</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> METHOD Paint( cValue ) INLINE DispOutAt( 2,20, cValue )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">END CLASS</span></div>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">METHOD New() CLASS TEST</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">RETURN Self </span></div>
</td></tr>
</tbody></table>
</div>
<br />
</b><br />
<b id="docs-internal-guid-1e0a2e63-2114-2ca2-28b4-4848db9b30ed" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-1e0a2e63-2114-2ca2-28b4-4848db9b30ed" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">También podéis observar como llamar al </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">method</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> de un </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">objeto,</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.6667px; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> en este caso , se llama a <b>Paint</b> de la clase Tests, pasando un valor</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, "From Harbour" ;</span></b></div>
<b id="docs-internal-guid-1e0a2e63-2114-2ca2-28b4-4848db9b30ed" style="font-weight: normal;"><br /></b>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadStart( {|| oObject:&("Paint")( "From Harbour" ) } ) </span></div>
</td></tr>
</tbody></table>
</div>
<b id="docs-internal-guid-1e0a2e63-2114-2ca2-28b4-4848db9b30ed" style="font-weight: normal;">
<br /><br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Este ejemplo de Harbour, </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/tests/mt/mttest01.prg</span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, podemos observar cómo obtener la respuesta de la función thFunc(), en este caso, la variable </span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">xResult.</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">static s_var</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local xResult</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? Version()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "join:", hb_threadJoin( hb_threadStart( @thFunc() ), @xResult )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "result:", xResult</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? "static var type:", valtype( s_var )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? eval( s_var )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? eval( s_var )</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">func thFunc()</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> local i := 12345.678</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> s_var := {|| i++ }</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return replicate( "Hello World!!! ", 3 )</span></div>
</td></tr>
</tbody></table>
</div>
</b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-77545284434056745952016-07-22T03:13:00.000-07:002016-07-22T03:13:44.720-07:00Threads con Harbour para novatos<b id="docs-internal-guid-0c030513-120e-41d2-d728-fb3b2f17e00c" style="font-weight: normal;"></b><br />
<b id="docs-internal-guid-0c030513-120e-41d2-d728-fb3b2f17e00c" style="font-weight: normal;"></b><br />
<b id="docs-internal-guid-0c030513-120e-41d2-d728-fb3b2f17e00c" style="font-weight: normal;"></b><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<b id="docs-internal-guid-0c030513-120e-41d2-d728-fb3b2f17e00c" style="font-weight: normal;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3ssygpJ9zZk7GJi-niK3iX6VrlHgMKO52XyVV60k3hFiYorHUt4Ruq9Cu0UaxkcklrH3eviHwinm6ggcEhtCm6I6IetOzsPEbe3qUo4iHxSf40BNGXwMWHJNJay_V2dc3bZdzJg_Iqvlh/s1600/java-thread-life-cycle.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="134" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3ssygpJ9zZk7GJi-niK3iX6VrlHgMKO52XyVV60k3hFiYorHUt4Ruq9Cu0UaxkcklrH3eviHwinm6ggcEhtCm6I6IetOzsPEbe3qUo4iHxSf40BNGXwMWHJNJay_V2dc3bZdzJg_Iqvlh/s320/java-thread-life-cycle.jpg" width="320" /></a></b></div>
<br />
<b id="docs-internal-guid-0c030513-120e-41d2-d728-fb3b2f17e00c" style="font-weight: normal;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Voy a publicar una serie de post sobre las funciones de threads que espero os sirva para<b> </b>comprender como podeis sacar provecho a programar usando threads</span></b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b> </b></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Vamos a empezar a usar threads con Harbour, y lo primero que tenemos que saber que para ello tenemos que compilar con soporte para threads.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Haciendo uso de </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hbmk2</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> , simplemente, le pasamos </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">-mt </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a la hora de compilar.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bien, ahora ya estamos preparados para tener acceso al uso de threads.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">¿ Pero que un thread y que nos aporta en nuestras aplicaciones ?</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Definición simple: Los threads nos permiten hacer varias cosas a la vez. </span><a href="https://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3n" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Threads Wikipedia</span></a></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un caso real de éxito, sobre un software realizado en Clipper, pasarlo a Harbour 32 bits, y después a usar hilos, fue realizado en un par de días.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Inicialmente ese software estaba en Clipper , que lo ha hace es procesar peticiones según se van dejando ficheros en un directorio, viendo por encima, es similar a esto;</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">while .t.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aFilesDirectory := adir()</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for n := 1 to len( aFilesDirectory )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? “Procesa fichero de peticion”</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Procesa( aFilesDirectory[ n ] )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> deletefiles( aFilesDirectory )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">end while</span></span></div>
</td></tr>
</tbody></table>
</div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Al pasarlo a 32 bits, fue trivial, recompilar y punto.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Pero este sistema tiene un gran handicap, y es que cuando se procesa una petición,<b> </b>el programa no puede atender a otras peticiones, por lo que el tiempo de las peticiones<b> </b>se suman.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Así si tenemos 5 peticiones, y cada una tarda 10 segundos, vemos que la última será<b> </b>procesada </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">10 x 5 = <b>50 segundos después.</b></span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">¿Y si os digo que usando threads tardaremos 10 segundos en procesar todas las peticiones ? </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b id="docs-internal-guid-0c030513-120e-41d2-d728-fb3b2f17e00c" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Os veo la cara iluminada ;-)</span></b> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El código de arriba, se convierte usando threads;</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">while .t.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> aFilesDirectory := adir()</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> for n := 1 to len( aFilesDirectory )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? “Procesa fichero de peticion”</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @Procesa(), aFilesDirectory[ n ] )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> next</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> deletefiles( aFilesDirectory )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">end while</span></span></div>
</td></tr>
</tbody></table>
</div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Este software funciona hoy en día con un rendimiento excepcional. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Quien diría que un software en Clipper de hace 10 años, funcionando en 32bits con Threads.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ahora, también nos interesa saber si el ejecutable cumple con esta condición, usando simplemente la función </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_mtvm()</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">IF hb_mtvm()</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ? “Soporte de Threads”</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">ENDIF</span></div>
</td></tr>
</tbody></table>
</div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A continuación , vamos a ver la primera función , que no es ni más ni menos que como crear un hilo ( intentaré usar los ejemplos que están en Harbour </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/test/mt/</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> );</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadStart</span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( <@sStart()> | <bStart | “sStart” > [, <params,...> ] ) -> </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><pThID></span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Esta función simplemente crea y ejecuta la función, @</span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">sStart()</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">y nos devuelve un id.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un ejemplo simple, seria poner un simple reloj;</span></div>
<br /><div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc main()</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> cls</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @thFunc() )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> @1,1 SAY "Pulsa tecla para salir"</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> inkey( 0 )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return</span></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><br /></span><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">proc thFunc()</span></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><br /></span><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> while .t.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> DispOutAt( 2, 1, Time() )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_idleSleep( 1 )</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> end</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: transparent; color: black; font-size: 14.6667px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">return </span></span></div>
</td></tr>
</tbody></table>
</div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 10.666666666666666px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">usar PROCEDURE si la función no retorna nada, simplemente es más optimizado.</span></div>
</li>
</ul>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b>hb_threadStart</b> permite llamar igualmente de estas maneras a la función;</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( @thFunc() )</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( "thFunc" )</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadStart( {|| thFunc() } )</span></div>
</li>
</ul>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Es exactamente lo mismo. Normalmente se usa @thFunc(), por ser la primera implementación y al ser un puntero, creo que es más óptimo a nivel de VM. ( VM = Virtual Machine )</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ya tenemos nuestra aplicación usando threads. Como vemos, la cosa es bien sencilla,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">de momento ;-)</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ahora , también a la hora de crear un thread , podemos definir la visibilidad de las variables</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">dentro del hilo. Fichero </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hbthread.ch </span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#define </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HB_THREAD_INHERIT_PUBLIC </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> 1</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Indica que las variables públicas son compartidas por todos los hilos</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#define </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HB_THREAD_INHERIT_PRIVATE</span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> 2</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Indica que las variables privadas son compartidas por todos los hilos</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#define </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HB_THREAD_INHERIT_MEMVARS</span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> 3</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Indica que las variables privadas y públicas son compartidas por todos los hilos</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#define </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HB_THREAD_MEMVARS_COPY</span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> 4</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Indica que lo que se envía es una copia , no la variable en sí.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadStart( </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HB_THREAD_INHERIT_PUBLIC</span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, @Process(), Self ) )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">otro ejemplo ;</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">hb_threadStart( </span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">HB_BITOR</span><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">( HB_THREAD_INHERIT_MEMVARS + ;</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> HB_THREAD_MEMVARS_COPY ), ;</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> @thFunc() )</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Un ejemplo de esto es el ejemplo en </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">harbour/tests/mt/mttest08.prg</span></div>
</b><b id="docs-internal-guid-0c030513-120e-41d2-d728-fb3b2f17e00c" style="font-weight: normal;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A tener en cuenta, es que cuando creamos un hilo, las variables </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">PUBLIC</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> que se<b> </b>creen en ese hilo , solo es visible en ese hilo o en hilos hijos, el padre no sabe de su existencia.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Y recordad que el acceso a escribir en variables compartidas por hilos debe ser protegido por el usuario, pero de momento, no te preocupes, lo veremos más adelante,<b> </b>con los <b>mutex</b>.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ah, y otra cosa súper interesante , y es que el ámbito de una tabla dbf abierta, pertenece en el hilo que se abrió, usando el mismo alias en hilos separados.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Esto, a la hora de portar código existente , como el caso anteriormente explicado, nos ahorra horas y horas de portabilidad de un sistema monolítico a un sistema con threads.</span></div>
<br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Siguiente post : </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hb_threadJoin( )</span></b>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-8145394045440585562016-07-20T04:52:00.002-07:002016-07-20T04:56:00.978-07:00Libería httpd. Core Custom<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9mi9R7Rx9cI6t6L1JgrNLjH-eQMRh1ZoI_uBUk39LjyI0HI27_vOQWnlNNbSh4q1G-kdNrY5nMJNN4_HnrtWaaJFfHAetd6tj1XKnHZctMSIw5Kqk6K7b_9SLqQ7FETByVsbcC0lvPpOx/s1600/harbour-logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9mi9R7Rx9cI6t6L1JgrNLjH-eQMRh1ZoI_uBUk39LjyI0HI27_vOQWnlNNbSh4q1G-kdNrY5nMJNN4_HnrtWaaJFfHAetd6tj1XKnHZctMSIw5Kqk6K7b_9SLqQ7FETByVsbcC0lvPpOx/s320/harbour-logo.jpg" width="320" /></a></div>
<br />
<br />
<br />
<span style="font-family: "verdana" , sans-serif;">Durante el desarrollo de apis usando la librería <b>httpd,</b> se ocasionan er<span style="font-family: "verdana" , sans-serif;">rores</span> , y podemos generar un errorlog para obtener esos datos.</span><br />
<br />
<br />
<span style="font-family: "verdana" , sans-serif;">Por mi parte, uso lo que trae el mismo ejemplo; </span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">oLogError := UHttpdLog():New( hb_dirBase() +"\log\web_error.log" )</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;">Y en el Hash de arranque del servidor;</span> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">"LogError" => {| m | oLogError:Add( Cstr( m )+ hb_eol() ) }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: x-small;"><b><span style="font-family: "arial" , "helvetica" , sans-serif;">*Nota: Todo:Enviar error por http a otro servidor de escuchas! </span></b></span></span><br />
<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;">El problema, es que si estás desarrollando un sistema completo de apis,</span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;">es muy tedioso ver que esta ocurriendo, y si la máquina donde desarrollas es distinto donde corre el servidor, es doblemente tedioso.</span></span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;">Para ello, me propuse mejorar el <b>core.prg </b>de la librería para permitir que la</span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;">salida de error me viniese en el navegador web, aumentando la productividad.</span></span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;">Ahora, ante un error, siempre nos muestra un simple :</span></span><br />
<h1 style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px;">
500 Internal Server Error</h1>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;">Ahora, con la modificación nos mostrará la pila de llamadas;</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ9taH7EA-K6T6I2gIvJFWHsJCKJGXL95nWiSKct1R_peKqj57GpOpHIY0GjRkSYECj_AVRW0VUdTz_CApV1pOEdPd6olv-T0sjmPVYwts5zXnFGsU2A4-nWywWZP1spKh0F_CqTBi9QMV/s1600/error500_wsCaptura.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ9taH7EA-K6T6I2gIvJFWHsJCKJGXL95nWiSKct1R_peKqj57GpOpHIY0GjRkSYECj_AVRW0VUdTz_CApV1pOEdPd6olv-T0sjmPVYwts5zXnFGsU2A4-nWywWZP1spKh0F_CqTBi9QMV/s640/error500_wsCaptura.PNG" width="640" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "verdana" , sans-serif;">Aparte, he modificado para poder indicar cuantos Threads quiero de arranque y </span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "verdana" , sans-serif;">la cantidad máximas.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "verdana" , sans-serif;"><img alt="" height="297" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtIAAAFQCAIAAAAdmA6zAAAgAElEQVR4nO3du44jV54n4Hklga8hL/kMsgsEH6DeQATSKshqp7w0iHLbKGOwwgLpJKA1ajAy1utFj2Zb0z0q1bakWoO3c49DFnmYrPo+/AGJjGDcSMb58ZyIrH/5WPL/fvv93/7r1//5H//4819+VkoppZQ6S/1LMXP8j7/+/d//9v7H//vru5/eK6WUUkqdpdLY8ccff/yvn9//+88Ch1JKKaXOXGns+P333//1r3//8T/FDqWUUkqdudLY8dtvv/35Lz9ffbOUUkop9fmV2KGUUkqpQSV2KKWUUmpQiR1KKaWUGlRih1JKKaUGldihlFJKqUEldiillFJqUIkdSimllBpUYodSSimlBtV5YsebP3331cs3bzrnfPHtVy++/WY9eldfrb57+f37dz+9f/f9m69f7P7/bAv/drNf59i7H16+fP3q4kcj2OC+904ppZT6xBobO75/8/U1Ase7n96/W7/+6txRY1c/vHwZt9zfv/n6xbdf/+mH0xb45k/fffXikrHj+zdfv/j2q9Xb/TOvVt9e7OAopZRShxI7PrlKfSefEh0uHDt+ePkyyhyHJ/V5KKWUunBdIHasX3/14vWr9et0xCF4Zj9z2NV/iCPfv/n6xeuX2+GY169+evvNi2+/Wb/9Zv/y1dt3Px0eRjkmXMsuDexHdr7adEIkQWHz6z8bbni1+var1dtgCytRoB1osqmvVvu1BHu0m6d0QH54+bKwDZtj/uqwa9+9/D7Y01qGqGztm/XbcP7y+/LT229efPfyT6/DDQ4P+MkdPEoppb6QulDsSILFrrGMejs2relu0vr1oYXb5IBDw7lpnpMMET4Mm8BDmxqtOpwUxo7166C9jH70b5re3aS337zIOwnCzas1um+/iSbtH0bPhz0ccW9HtEnhzm6Pw3aTdgkmfFja2o5+qfr7sl1LEL/yqeVDpJRSSr1/d7HYkfYlhHki6PyodAOkYzFxe5ZcORHMvOmfOGxYuIpy7MhGHJKlBS10c+wj7LdI+0Wi5ew3oz7eFK0oPUqHDY7yVpKxso0vb0yxprpnggiVHb0LXkCjlFLqc6iLDbLsp1ZiR6EVj5rksPUqdBjEIzJp+x2MEbRjR7Lk92FTmoSYrksuwiGe/WuDVQdN+G7oJOseCFeUp4T9oU62J+nGODl2tN6X6SMfz6CUUkrFddXYkbR/nx47Dq3+dy+/7+ntyJvJT4sdu4rvDfnh5cvCwMq7+BKK4oBLcl9ueN3GabFjcpCl9b6Ujny+eWKHUkqpWj233o7Xr346OXY0+/yP6e3YPPMpsSPpCdgen/oYxCZe5Eem0TlxWuyojoPsnm+9Lx39TEoppVSjrhY7pq7tOCF2pF0XUZfDadd2dMSOcgNfuFnmu29WjZ6GQ9ypX14abdWJsWPyBtqpazuSa26i0HaBv8OmlFLqc6rrxY6JO1lO7e1Ibqgpppz+O1l6ejuyv76Vv3Z/JUfxSthk8xp3stRn648dk38ubOJOlvx25egNdSeLUkqpel0xdrx/V7z286dPuaQ0vKPk9avonpfgEs7G3+1IGuPeQZbwT2uUr29IbjxJ15vfuZNveXyUTo8d+QZnc5bfl+IVo8WraJVSSqlS+afgBtX0natKKaXU515ix5hyZ6lSSikldly8sqs6lFJKqS+1xA6llFJKDSqxQymllFKDSuxQSiml1KASO5RSSik1qMQOpZRSSg0qsUMppZRSg0rsUEoppdSgEjuUUkopNajEDqWUUkoNKrFDKaWUUoOqHDuUUkoppc5e5djxEQDg3MQOAGAQsQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQcQOAGAQsQMAGOQMseNHAIAOZ4gdHwAAOogdAMAgYgcAMIjYAQAMInYAAIOIHQDAIGIHADCI2AEADCJ2AACDiB0AwCBiBwAwiNgBAAwidgAAg1w2djwsZjWL1epuNpvN7laP4SseN88uHtov30xPXpRPCKcEknXm21qcob68w1or08MF1mbJ1nrYoHRztlOSfe2ZWNmIyv7Gx796UODy0pOBjyPcqM8hdkRtaDWQtJZQWFP5rDa1vPr0/QJ7Y0cjBn1a7KhtwNQRqR8VuLTH1Z1PH3wWRg2y5I3htvXriB3tH+77lywKcxdWsm91DzPunoqjQ2m1jeUtHmo7FT9Z3u/MZt/vFovC3J8SO3ZxotT/knXaHGbaz+PUzzU8LCZPBMBNuP3YcXhFYfbyStIZ07m2TX6hgS0tL3yuY319sWO/CaXZT48dtUgVr6W4CD83uZ7H1Z3UAZ+Hm48d4Qt6V5LNGIwodGWc43o7tks/prcjCD6F+U+PHdWJhezkLM9zkQ4Myr9wu64eO8ra13bkAwS1n+mVNj5vWNNVVdrc6kbHmaK+S41Z8q2pdY+cHDsakScIOn1jWzDMwyL82D6u7iQPuFk3HjvKwyP14ZP46fZtL41Blmpg6LhzpiN2JHuR7YTYwZftcXXnAwo36uqx45MGWSab8M5BluK2To1FNDYo7nzpudykuP5ENVz175tBFj4LDwv9HXCjbjp2TN+u2rGS0kzVhve42FG8AWQydrTuOn4I5xh7Sal7CXg+xA64WbccO5q3jWyebdwHkg9q7J/J52ivsjU9uzt1ahHV20g6j0vnDbSlkaEsLbmBlucgG1NxWxXcrluIHQV3q8dq+x3mjs4/F1acrfcG2qnpSfCYuOq0khqi3FE9LsEC6nvc9efCKjM51XMVD4tZ8rNAxxvcqNuNHfW/6hXkjqlLQPNXtWY5LXYkwaMdO+KbbQvLmEwWk7Ej2qJZZXWFQyJycE3hp1HmgNvln4IDAAYROwCAQcQOAGAQsQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQc4QO34EAOhwhtgBANBD7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQcQOAGAQsQMAGETsAAAGETsAgEHEDgBgELEDABjksrFjvZzVLO/v57PZbDa/fwpf8bR5drluv3wzPXlRPiGcEkjWmW9rcYZkedE8wYvjLThMSJe5mxLMX3gKCD3dz7MvSO1r2Z4EXMXnEDuibFENJK0lFNZUPkeFywvmCF8eLbiVZXbL2j0vdMCEzZck//pvnwn/vz0JuJZRgyzbNjX42j91x46Jc8XuJcvC3IWV7JNDcnbaPxM/Kq4rWUAUWsKXbSbMl8vSrsbBIw0hQOTwNUu/Y8GX5ul+HgX5yiTgam4/dhxeUZi9vJJ0xnSubVoonKF2c86Drdw+uX0uHzSZ3z+VN+Nj3hvjrAgl62XwVUpOI9G35vBEYxJwPTcfO8IX9K4km7F6aUZlbfP7++V+sdvUsXkqXECQXqq5o++SEuDjx4/5WMl6WR1zaUwCrufqsaOsfW1H0nF6eCZbS6W5j8LNx9KqKien/fLW26zxdBhurmSZaOSmFCz2q3ZChAliB9y6G48d5eGR+vBJ/HT7tpfWIMtu3GR+/7S/yC1Zd/Kwmju6e1oAsQNu3dVjxycNslSjy0Rj315wo/shWN42biz3l9bHC+3oqSnM5pwILWIH3Lqbjh2NDpPtYjtWUpqp3BuSzBokhvDx1L2/5T/U4UYW6OCSUrh1txw7mrephJd7lv+0V3rtZzY+MhE7DqFns/hwa4tbnt6ZG0cNwQMmZT0WbqCFG3MLsaMg+EsX2YkkzB2dfy6sOFv72o7wVVlIquSlKHfkMUPwgAn5QMnT/Tzu3UyuKC9PAq7ldmNH/a96BbmjHDuKJ594ZVN3shRunDk8ijpcCi+vDqrstkHwgKJiegi+5v44Ojx3/ik4AGAQsQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQcQOAGAQsQMAGOQMseNHAIAOZ4gdHwAAOogdAMAgYgcAMIjYAQAMInYAAIOIHQDAIGIHADCI2AEADCJ2AACDiB0AwCBiBwAwiNgBAAwidgAAgwyJHQ+LWWjxMDXT3erx3DsK3KaHRXZK2Jwt4jPJ4+pu89TDonaSqdu/eJjH1d3EKXErODM2Tozh4prLC2ZMFtdaRP1VrUlQcvHYkUSOyuczn8sHGPjwoRQJdueL8MlPCw6jY0cYpR4W9aQQTntc3VVOjPGUxvKiGR9Xd4cXtRYRHpzkQDUmQcVlY8c+Bwefxd0ZI/j67GbbzBU/Ar5waXv2uLqbLR6STo1Cn8gnrOKy0rXV+meiYFB4XHu6dizS5w8vbC0ieVU4a2MS1Fw0dmwTRvY53D4fh+k0avv4Ah8+fEibs+2j+MmkmTz8hLlbPVRGAYLRgcWqEAT2Eyd/50db2DFc3Bk7Tm7Fe+NJYzyqkUi6JkHVJWNHmiYO0twRfFH1cQCJ6Ff1w2Lz/2Ebl/4Ej3pOS4MU0YP4hLR51e5MdBhvyAcl4p9Ku+tK4nnql7JNDrJsF3o4PXa26LX1lmNHfdhms4gsmhymNSZB1SVjRxouDuKzQTCv9AHkggbu8L/FJ7PYURyISdvboOnPmuL9E8GUx9Xd7O7uLl39Mc3uobOl1ScSnAzr13bE6td2lAZZqqMxpUN7eJXYwcmeS+wInj0y2QOfvcMP9WLAiNq/dJAlDhdZR8l++Yc+jeTUFOWOfTYJri7J+lemmt4oGdQa//z5jlY97qoprjfq8CmsOVmE2MGZPY9BluJUH19gaxcUNpeT7p7dtnv5ZR4TsSMfXNi/qHB5QtxJsh1L2f4n36bpizuyxrncWrcCUP0gTZ03oyGbfHn5IsQOzuw5XFKax5Nybwjwxdo0cUko2D7cXe0RzhlMjpZxYm9HtMDH1V2wmIc8qBxeVzqN9V5jkV/w2YodPZmj9JLkFqFiL7RLSjmjQTfQJueEpC8jvQu/dFc+8EV7WMxmi8Uib+cWi/xW2onYcdq1HbslLhZ34b2ld/WmttwMl/8QSeF0lz5d70zoyxyF+13TGworW+EGWs7nefy5sOSqjtIswJetODZbeLIndpxyJ0swMfmJVLt3pdo50XVtR7q86MKM+uJa6n99rLWIcM7SbcTlSVDxPP84ug8vkCj/HM8b467Y8SH6tdP6ux2FCz2SLoLaXwNpnsjC+Zo/sSp/XiAe6igI0kXWr5Murr2IeIZ0YxuToMQ/BQcADCJ2AACDiB0AwCBiBwAwiNgBAAwidgAAg4gdAMAgYgcAMIjYAQAMInYAAIOIHQDAIGIHADCI2AEADCJ2AACDnCF2/AgA0OEMsQMAoIfYAQAMInYAAIOIHQDAIGIHADCI2AEADCJ2AACDiB0AwCBiBwAwiNgBAAwidgAAg4gdAMAgYgcAMMhFY8d6OZvNZrPluvDs/P7pTMsDPnPrZemU8XQ/P+F0cNqrPsX2xDV13nu6n+/na29gsMD6fBfYz/Vy+sRdmqdxAKq7Eh6NYhPSOp5P9/PGi9JX1Se13pLKVvQcoy+d2AE8dzccO8LVPd3Pa6e+eNJ6WT/RhceifFzyFZ9FR4O6aabjucJ9SQ5AfVfSKYcd6Tiem4Yi3PVoEY1DHU1qvSWtrRA8pogdwHN3u7Ej2fKn+3nx3Jc9XwsU6davl7WdOfN+1lcUri/78Z/uWPC4viuNnZw6noc+iMZBCpZfn9R6S9pbUehrIfQMYkfUj5XEydlsvlzOdx/l/fIOH61Gl136OZilYXoWfvJms9lyuSx2pgHX1RU7KmeSza/P++XupLB51f1h5nrnfqN9i9ugcPkn7EhBLZ9krX/0RLDxmz1M2t50v/LNqaWL+PlslzcrXq57Y9b0riTHonJWzvtIDm9x4zTeyFDtHNcVO5p7zfVjR3ymmDWmbD/Ruf3bW1hW1A02FTsK5xrgGZiOHXFLE/V7J33uyckg6jzftVv5QtqxIz/NFfV3QNTmzBu0w4YUdjrescKD9MD2pY7GLicL3L6u9EOxtSutRSZHo3aUWse5Ef46VzYx1CN3NI2IHUXBF6X8TdmHiChiR5/c3eN9l1g4cfc4nDgRO3xO4FlqnEoOp4v092ajX76cILLWKnhiInb0XGl5xEmmem1Ho60uJYjKoEUwb95d0BEmGrscT4nOwh/jY98ROwqNQLR3tePZjh3dV9jkK8w6Z1qbp9e85sqxozhrFDuy71GhV3V+/zQxe98gi08JPEv913YUboBImoByc7dcl9ZSH+lPYkfvyaOnv2M/YFGZVm6rsynxtifLO2xzsCPVjSvGlp5Rj7wZb1w7UQ8zx/Z3tI5y1KHVOyl9S+L9KoRE3R0t1x5kKSWTidhRfmY7e/ZTReyAm9c5yHI4gaS9Hd2xo3Chxzljx2TfSCtzVDd+fv/UukyjNPwcp7JyZ0+8USfHjjzw7FfXGTv6r+6YmP0smaOwznI/jRal4rqxIxkYKQ2y6O2AL95k7EhnOCZ27Oct93YcxoMvHjsmMkdxZbsnjuvtKGxRY66TY0dhxnh8p+uS0jPFjjNljtKGFofn9HbUXDd2xDNEl2o0ckR6bUd4mUj72o7sl5HYATdgKnYUL+1oxI7yb9epazsqveyt2NFaZGnWybNQ+vriaMl+SmVScrzWy90tg7W1l5bdlwLSOeuHtLErfW9R88nzZY7S9mUpw7UdLc+jt6PU99eIHbF4hK24rIluRrEDnrWu3o7s216OBcmZJXpl1ALVB/DjRbSbmHzLqpcv9J2Cwjmj4xItPDmp5VuRBq/2KTDZx/7YEa8saeH7dqXwFk0cz3QHz3URaeVV+Yw6O5qufW1HkBWW6+gCjdaoyeFF6VsbRo/6Vav7JYgdcAOmr+2IflnMt3/k5/D9zgZZ1vvZk+WGyylc6LGbEDQsk79sw7NSeahi+uqLbDRichMbf7cj29zNtNZOxNtwROxobm/frkzfgJBIYkfj92p9UvstaW+F1NHmn4IDYIJhg25P9/5KaZPYAcCk9dJP+B6O0xSxA4AOGtRpjtE0sQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQc4QO34EAOhwhtjxAQCgg9gBAAwidgAAg4gdAMAgYgcAMIjYAQAMInYAAIOIHQDAIGIHADCI2AEADCJ2AACDiB0AwCBiBwAwyEVjx8NiVrR46Nu47es3sz+u7maz2exu9Tg5a2T7ukRlMbXN6N1i4IK23+aLfB8fFq3zQnQeSdcfnOnKm/awyBcdvKjndJQvIj2/1pdS3b5wEe2NqO/ikfsBV4kdveeNC8aO3m245GkOOMrj6m62WDTjwak2Z5DKch9Xd8G0h0V0SgjjSjG6bE4i8dPhMuKlF5UW8bi6680r5e2L9qO5EfVdfFzdHbMf8GFM7Ija7F0KOLoh/8TYEb5un0SmN0LsgOdi2+K1uyVOXnL99JI18MEWhO3ublLw8PCrJz0DtR5nay9tXbKmivr2pa9P5+xYRBqzepMQX7bhsSOOAVkmiF7S7u0IujEWD0fFjtKmRT0z25mT3prdzDoV4Qr2bVyWOzYN4eGLGUx8WMzuVqtF8+t6eHnnFzpoXrPGP3hic+5ZPHxC61xbxLbnp5w6wm1qbV/nyxqLEDs4wbV6O8KfCqfEjsrQSXfsKK4oXVIhdhTWqycEBgiauLQNjs80UWf/ZlLrS7pbWH/sCH7+5w1taTHJc9tmuxiTprYy2oZAY3hoevuaE5qLMMjC8a5zbcf+JHBq7EiGalqjJpXYEY6eRGemYryJOzriwVFfNLi8+mUJ2cOwMZwKE4dGtTt2pNdlHBs70oHmrua6mLT2T1QX0R076hsxuYjDed5PMHpc+ZLSE2NHHiWOHWQpXrQR/oAoxo7KDvmywWWl1xfEj7NhgDhM1L+gYZPaFzv2ox75Ag7b0hE7sgGTidNIT3wqLKIzdsQhpn8RzWttoexq13Zsnj1b7Khf+tkxyFIasTkmdujugIuaGFQ9MXbEDWpH7EgyR7aI2mLqd390r3tyjvIMPdvXyhztRRQvsnE6ZML42BENTZw6yJKNbhzb25GPsTSvIYljhzwPI5V+yofPFS96nIwdlSxTazbzzFFddWmm/NqO+gwFJ8aOye2byBztRRTjnvMjE67X2xHGjso1Ghe7tiMKGuVrVcvXvD4sGhOBSyg3ZkEHf+najtqdJlXNhr2cOQrbVlxf6cKMrntXq4vIXlG7iaS5fR2Zo7mI4u01zodMuNa1HVlgKE1t3MlSWXY9djRmLi6qcMfM3erRnSwwWu2SgUPuKNzJUh1/aa6m0mQ2L1oIJza6HOoXc3Q1/sXxjHgRjdtpS9t3xI0n1V10bQcnuPKdLMlcyd/faMWO6IUdf7ejmRXiP8gTj+Bkf6wnWqDvGFxWvTHbN3qbpnBVuqPiDLFj+m796BzWu+ipF00vIjzBhosojoqk85XPzuHPuslFtLcCKvxTcMCNcyUj3A6xA7hxYgfcDrEDuHFiB9wOsQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAY5Q+z4EQCgwxliBwBAD7EDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQcQOAGAQsQMAGETsAAAGETsAgEHEDgBgkCGxY72cBeb3T2defuf6l+uPHz9+fLqfn3Urtsvb2awEOKP4FPIpX7X18rxf0vUyOZmsl5vllzb5hDNPtvwrGbMd8dn03CfT5Fw9sZpg7qkdXy8Ps4QrSZYcfiQai2wc6ujT+3Q/3/1/uAE34OKxo/zlG3uILhY7jvsYA6fJz8Tr5WnftEvHjl3qOFc7/eXEjvUyPi9vzq6XPJk+3c9rO/V0P9+vO/z/krDNDw9T/BGNHjXW3Huok626qeBx2dixa5YPx2PfUF/tEJ0vduwSVfTWCx5wdoUz8dP9/JRv8YVjx9P9fPtI7Pj05Z+aLbu0mv78XW2GhChNBNsbTEs/d40sc1Ls+Ph0P7+ZdueisSPqZdgpvIO1vqfN8/P7p/0Mm6nJw49Bllgf+h+yNFDr7QhWn2Xt2Xy5TKNTsspsV27lvYdb0RE7wq7H+Ns9v79f7p+Ov6GVTv3Nste1XvbDGWOz6OhnVfhbd6InfbkOzj3Ldbjg6EfyfgeyLWls//J+Oy38zV49yx65n5WTZna00xXUzo21Rni9zp5rnWKPOf223p+skarnjtYqm90k9Rc23vLdi0rH9MQcfg2XjB3bz3n7Y1AapwgGrDLz+bwwb3u0oxE7Ci8sfEtLu7HPROc5WEBVcZAlbQV3j6OfsZvvafwbpNh5Hr4qPnXFP4vDX+Dpb48gdfTEjuw0FD4MOk0qmzK1/enxSaLM08d0I6O5GvtZnS872vFASb3z4oi8cJ7Y0R44yZZTnX1qa6qfgIkLOCpvefXTu3vmNhqkS8aOYmdHLB2F2T0+jI7mj+KHm1fuM0KSGaJZC7EjyQ7hw3SR5S2/jXcZblv5ErFa33b4ROHai+BMkHWXBCeJpLM8OC0kXdvRCSQey8+VB/6TDv9k+7MVLtfHb39Po9m1n9nRDg5xcrRL19uWzplTV0+0trl3WjZjY87u2NHan1bjN3ltR/ktb8eO2+lrv27sKLTd4YuSBRQfRhkh7wTMlxPOWjkz7L/UjVwhdsAw+ek9/B1dmbr/8qdtZHJKyu89SFv0uHsgenlyDWHcrdJ/u0Jh7CdraA7T6iMtxe2fvlggGzOp72ezuavuRntTpmNHpT/7sEX1gFfZ3dYB6Y0dHRebltYT9c11rj17WwrrvpnujusOshTmCJ9q9EV8LMaONCGeGDvCz3Kzk0zsgBFK5+96tOiMHUFztVxnvQXF2NHs2Y5Sx4DY0b397csIgpNez342B7Tz3Shc/FZpiMf1dkzGsHPFjlrwOmHtvbHjJro7xl9SWvjet3s7jogdJ/Z2FN+oqdhRnn4zeRNuyHTsyDsAyj/b41/mjUGKo3s7wgs7Kptc36P+2LF/Yf/21zalMVxyVG9HPNdkb0fhxbWFHjmS0Bc7+vpWei4pPTp2FDJHFOP2b2zlM6a3o8PuiCaDlllcaF7bcUTsOPHajuTCrlqSSe1+KcT9qvUgA5ymFjsqVxs0mu394+KlEZOxo37NQ5I6zhk7iuHiiO2vtY6lYzN9bUe2Y3GHT7PHp35QilNKl2B8euzomCvZmmp7XngX6/s73c9RXkr503xkIntWLv3nwiaH3UrjHKWrN9oPy6sJhlwrsaP0wnpPTKYySHMT7zzcjtbVG7vp8Y+X8Mtf7+3YT4p/ANVjR/yy4CSRpo5zxo5khUET37n9Sfu9W3x0oNKfUZX9LK85PGXnY+bRCb16dkxb5fi159PVJxAemlafRrLDhSNaeOcm1N/yduy4mc6O5/HH0cPp+YDLUYMs632MqAy45HEiSh7JN7/jg5IEF5EDzq7162Qr/CImP7gr13ZEL5lv/zxQsSekkBF2r9r9PYv4wo7KJgdnpuMGWQ4Lyxv1ju1PZ07y2v7JpG0s7WfxddWjncw6eTaND9plTqaVPFgcWJne7vJlINnryp+GesdP5S2P1hb31d9Q6vhc/im43owAAOfyXEY2nu79ldLBxA4Axlsvn0HL8yw2opfYAQAnu3qbf/UNOM5nEjsAgOdP7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQcQOAGAQsQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQcQOAGAQsQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQcQOAGAQsQMAGETsAAAGETsAgEHEDgBgELEDABhE7AAABhE7AIBBxA4AYBCxAwAYROwAAAYROwCAQQqx41//+vdffvv9KlNpasEAAACESURBVFsDAHzGCrHjh7/98r//8etVtgYA+IylseP333//7/e//vkvP0seAMB5pbHjjz/++Oc///mPX97/8Ldf3v6f//rzX35WSimllDpLpbFjnzx+/fXXX3755b8BAM6kEDv2yeMDAMD5lGMHAMDZiR0AwCBiBwAwiNgBAAwidgAAg/x/qEWzUk5MMwsAAAAASUVORK5CYII=" width="640" /> </span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "verdana" , sans-serif;">Todo ello configurable simplemente con un par de methods nuevos a la clase ;</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;">Local nPreAlloc := <span style="font-family: "courier new" , "courier" , monospace;">5</span>, nCount_Max = 100</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;">oServer := UHttpdNew( )<br />oServer:SetConfigThreads( nPreAlloc, nCount_Max )<br />oServer:SetDebugHTML( .T. ) </span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;"><a href="https://drive.google.com/file/d/0B_wIHC343Y8YT1RuTkxheE9NM2c/view?usp=sharing">Enlace a gDrive para bajar el core.prg</a> </span> </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "verdana" , sans-serif;"> </span> </span>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0tag:blogger.com,1999:blog-174608198622440243.post-79413533265164082802016-07-08T02:53:00.001-07:002016-07-08T02:53:25.507-07:00Using SQLITE3 with Threads in Harbour<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.apprendemos.com/wp-content/uploads/2012/08/sqlite-logo-560x315.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.apprendemos.com/wp-content/uploads/2012/08/sqlite-logo-560x315.png" height="180" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<span style="font-family: "verdana" , sans-serif;">The wrapper of the library SQLITE3 to Harbour, support THEADSAFE, but it is important to use the same handle <b>pSqlite3, </b></span><br />
<span style="font-family: "verdana" , sans-serif;"><b>using https://en.wikipedia.org/wiki/Singleton_pattern</b></span><br />
<br />
<span style="font-family: "verdana" , sans-serif;">An easy example to see;</span><br />
<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">CLASS TLogSqlite3<br /> CLASSDATA Self <br /><br /> DATA pSqlite3<br /> DATA cErrorSqlite3<br /><br /> METHOD getInstance()<br /> METHOD Open() PROTECTED</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"> METHOD Exec( cSql )<br /> METHOD Close() INLINE ::pSqlite3 := NIL<br /><br /> METHOD InitClass ()<br /><br />END CLASS<br /> </span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">METHOD InitClass CLASS TLogSqlite3<br /> if ::Self = NIL<br /> ::Self := Self<br /> ::Open()<br /> endif <br />RETURN Self<br /><br />METHOD getInstance CLASS TLogSqlite3<br />RETURN ::Self</span></span><br />
<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">METHOD Open( ) CLASS TLogSqlite3<br /> Local lRet := .T.<br /> <br /> ::pSqlite3 := sqlite3_open( hb_dirBase() + "text.db", .T. )<br /> <br /> IF !( sqlite3_errcode( ::pSqlite3 ) == SQLITE_OK )<br /> ::cErrorSqlite3 := sqlite3_errmsg( ::pSqlite3 )</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">lRet := .T.</span></span></span></span><br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;"> ENDIF<br /><br />RETURN lRet</span></span><br />
<br />
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">METHOD Exec( cSql ) CLASS TLogSqlite3<br /> Local cSql, lRet := .T., cOldDataFormat, cOldTimeFormat<br /> Local cWarning := ""<br /><br /> IF sqlite3_exec( ::pSqlite3, "BEGIN TRANSACTION;") == SQLITE_OK <br /><br /><br /> IF sqlite3_exec( ::pSqlite3, cSql ) != SQLITE_OK<br /> ::cErrorSqlite3 := sqlite3_errmsg( ::pSqlite3 )<br /> sqlite3_exec( ::pSqlite3, " ROLLBACK;") <br /> lRet := .F.<br /> ENDIF <br /><br /> IF empty( ::cErrorSqlite3 )<br /> sqlite3_exec( ::pSqlite3, "COMMIT;" )<br /> lRet := .T.<br /> ENDIF<br /> <br /> ENDIF<br /><br />RETURN lRet </span></span><br />
<br />
<span style="font-family: "verdana" , sans-serif;">For use in you aplicattion with threads ;</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;">o<span style="font-family: inherit;">S<span style="font-family: inherit;">qlite3 := </span></span></span></span></span></span></span></span></span><span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">TLogSqlite3():getInstance()</span></span></span></span></span></span></span></span></span></span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">oSqlit<span style="font-family: inherit;">e3:Exec( <span style="font-family: inherit;">cSql )</span></span> </span></span></span></span> </span></span></span></span></span></span></span><br />
<br />
<span style="font-family: "verdana" , sans-serif;">The explanation is very simple.</span><br />
<span style="font-family: "verdana" , sans-serif;">If the TLogSqlite3 object instance per thread, then insert each other will be blocked, because the table is locked, not being theadSafe.</span><br />
<br />
<span style="font-family: "verdana" , sans-serif;">But for compliance Thread Safe, need to use the same variable pSqlite3 for all calls. Using the singleton pattern, we solve the problem of locking the table. </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"><span style="font-family: inherit;"> </span></span></span></span></span></span> </span>Anonymoushttp://www.blogger.com/profile/17961187955116998181noreply@blogger.com0