<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Multi-Thread Programmierung]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>wie versprochen hier nochmal eine Frage zu der Multi-Thread Programmierung.</p>
<p>Habe mich mit dem hier im Tutorial beschriebenen Weg zur Thread-Programmierung auseinandergesetzt.</p>
<p>Zu meinem Problem:</p>
<p>Ich benötige einen zweiten Thread, um eine .dll zu laden und auf den Rückgabewert zu warten.</p>
<p>Habe das ganze mal exemplarisch ausprobiert, habe aber noch Probleme den Thread ordnungsgemäß zu schließen.</p>
<p>Hier der Code</p>
<pre><code class="language-cpp">//UNIT 1
//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Unit1.h&quot;
#include &quot;Unit2.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TmyThread *FNewThread = new TmyThread(false);
}
//---------------------------------------------------------------------------
</code></pre>
<pre><code class="language-cpp">//UNIT 2
//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Unit2.h&quot;
#include &quot;Unit1.h&quot;
#include &quot;vektor.h&quot;
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TmyThread::TmyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
 FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TmyThread::Execute()
{
 if(!mclInitializeApplication(NULL,0))
    Form1-&gt;EditMCR-&gt;Text = IntToStr(0);
 else
    Form1-&gt;EditMCR-&gt;Text = IntToStr(1);

 mxArray *x;
 mxArray *y;

 int nargout = 1;
 mxArray *tp = NULL;
 double x_value[]   = {1,2,3,4,5};
 double y_value[]   = {2,3,4,6,7};

 x = mxCreateDoubleMatrix(1,5,mxREAL);
     memcpy(mxGetPr(x), x_value, 5*sizeof(double));
 y = mxCreateDoubleMatrix(1,5,mxREAL);
     memcpy(mxGetPr(y), y_value, 5*sizeof(double));

 if(!vektorInitialize())
    Form1-&gt;EditDLL-&gt;Text = IntToStr(0);
 else
    Form1-&gt;EditDLL-&gt;Text = IntToStr(1);

 mlfVektor(nargout, &amp;tp, x, y);

 mxDestroyArray(x);  x  = 0;
 mxDestroyArray(y);  y  = 0;
 mxDestroyArray(tp); tp = 0;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Es funktioniert soweit. Einerseits das laden der MCR<br />
&quot;mclInitializeApplication(NULL,0)&quot;, sowie das Laden der eigentlichen .dll<br />
&quot;vektorInitialize()&quot;.</p>
<p>Jetzt benötige ich nur noch eine Hilfestellung.</p>
<p>1. Wie setze ich die Methode Synchronize() ein, und wie schließe ich den zweiten Thread ordnungsgemäß.<br />
So wie es im Tutorial beschrieben ist, funktioniert das nicht.</p>
<p>LG<br />
Todd</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197518/multi-thread-programmierung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 15:00:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197518.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Nov 2007 15:46:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 15:46:15 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>wie versprochen hier nochmal eine Frage zu der Multi-Thread Programmierung.</p>
<p>Habe mich mit dem hier im Tutorial beschriebenen Weg zur Thread-Programmierung auseinandergesetzt.</p>
<p>Zu meinem Problem:</p>
<p>Ich benötige einen zweiten Thread, um eine .dll zu laden und auf den Rückgabewert zu warten.</p>
<p>Habe das ganze mal exemplarisch ausprobiert, habe aber noch Probleme den Thread ordnungsgemäß zu schließen.</p>
<p>Hier der Code</p>
<pre><code class="language-cpp">//UNIT 1
//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Unit1.h&quot;
#include &quot;Unit2.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TmyThread *FNewThread = new TmyThread(false);
}
//---------------------------------------------------------------------------
</code></pre>
<pre><code class="language-cpp">//UNIT 2
//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Unit2.h&quot;
#include &quot;Unit1.h&quot;
#include &quot;vektor.h&quot;
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TmyThread::TmyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
 FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TmyThread::Execute()
{
 if(!mclInitializeApplication(NULL,0))
    Form1-&gt;EditMCR-&gt;Text = IntToStr(0);
 else
    Form1-&gt;EditMCR-&gt;Text = IntToStr(1);

 mxArray *x;
 mxArray *y;

 int nargout = 1;
 mxArray *tp = NULL;
 double x_value[]   = {1,2,3,4,5};
 double y_value[]   = {2,3,4,6,7};

 x = mxCreateDoubleMatrix(1,5,mxREAL);
     memcpy(mxGetPr(x), x_value, 5*sizeof(double));
 y = mxCreateDoubleMatrix(1,5,mxREAL);
     memcpy(mxGetPr(y), y_value, 5*sizeof(double));

 if(!vektorInitialize())
    Form1-&gt;EditDLL-&gt;Text = IntToStr(0);
 else
    Form1-&gt;EditDLL-&gt;Text = IntToStr(1);

 mlfVektor(nargout, &amp;tp, x, y);

 mxDestroyArray(x);  x  = 0;
 mxDestroyArray(y);  y  = 0;
 mxDestroyArray(tp); tp = 0;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Es funktioniert soweit. Einerseits das laden der MCR<br />
&quot;mclInitializeApplication(NULL,0)&quot;, sowie das Laden der eigentlichen .dll<br />
&quot;vektorInitialize()&quot;.</p>
<p>Jetzt benötige ich nur noch eine Hilfestellung.</p>
<p>1. Wie setze ich die Methode Synchronize() ein, und wie schließe ich den zweiten Thread ordnungsgemäß.<br />
So wie es im Tutorial beschrieben ist, funktioniert das nicht.</p>
<p>LG<br />
Todd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401422</guid><dc:creator><![CDATA[Todd]]></dc:creator><pubDate>Sun, 11 Nov 2007 15:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 16:19:57 GMT]]></title><description><![CDATA[<p>Die Execute-Methode wird einmalig aufgerufen, d.h. solange du da keine Schleife drin hast, wird der Thread nach dem Abarbeiten der Funktion wieder zerstört.</p>
<p>Du mußt nur, die Methode auslagern, um Synchronize aufrufen zu können:</p>
<pre><code class="language-cpp">void __fastcall TmyThread::Execute()
{
  Synchronize(MyExecute);
}

void __fastcall TmyThread::MyExecute()
{
 if(!mclInitializeApplication(NULL,0))
    Form1-&gt;EditMCR-&gt;Text = IntToStr(0);
 else
    Form1-&gt;EditMCR-&gt;Text = IntToStr(1);

 // ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1401456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401456</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sun, 11 Nov 2007 16:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 16:49:39 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort,</p>
<p>wenn ich das so mache, dann &quot;friert&quot; meine Anwendung ein, solange ich mich in der MyExecute von TmyThread befinde.</p>
<p>Woran kann das liegen?</p>
<p>LG<br />
Todd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401481</guid><dc:creator><![CDATA[Todd]]></dc:creator><pubDate>Sun, 11 Nov 2007 16:49:39 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 16:50:59 GMT]]></title><description><![CDATA[<p>C++Builder-Dokumentation schrieb:</p>
<blockquote>
<p>Die Methode Synchronize führt innerhalb des VCL-Haupt-Threads einen Methodenaufruf aus.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1401483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401483</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 11 Nov 2007 16:50:59 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 17:47:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<blockquote>
<p>Die Methode Synchronize führt innerhalb des VCL-Haupt-Threads einen Methodenaufruf aus.</p>
</blockquote>
<p>Das sagt mir leider nichts. Wie kann ich denn verhindern, dass mir das ganze einfriert?<br />
Brauche ich die Synchronize Methode überhaupt?</p>
<p>Danke<br />
Todd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401515</guid><dc:creator><![CDATA[Todd]]></dc:creator><pubDate>Sun, 11 Nov 2007 17:47:13 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 18:17:22 GMT]]></title><description><![CDATA[<p>Todd schrieb:</p>
<blockquote>
<p>Wie kann ich denn verhindern, dass mir das ganze einfriert?</p>
</blockquote>
<p>Nicht Synchronize() benutzen. Was du dort als Argument übergibst, wird im Hauptthread, also demjenigen, der für die Benutzerinteraktion zuständig ist, ausgeführt, und wenn der mit dem Ausführen deiner Funktion beschäftigt ist, kann er eben nicht mit dem Benutzer interagieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Synchronize() benutzt man i.d.R. nur, um auf nicht threadsichere Funktionen wie die der visuellen Komponenten der VCL zuzugreifen, also z.B., wenn der Thread nach dem Beenden seiner Aufgabe das Ergebnis in ein Memo eintragen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401533</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 11 Nov 2007 18:17:22 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 18:51:58 GMT]]></title><description><![CDATA[<p>Okay,</p>
<p>danke. Jetzt verstehe ich es.</p>
<p>Wie kann ich aber verhindern, dass innerhalb des zweiten Thread's etwas schief geht und er aus diesem nicht mehr heraus kommt.</p>
<p>Wenn zum Beispiel innerhalb der .dll ein Berechnungsfehler vorliegt und nicht mehr aus dieser herausfindet.</p>
<p>Gibt es eine Rücksicherung für solche Fälle?</p>
<p>LG<br />
Todd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401553</guid><dc:creator><![CDATA[Todd]]></dc:creator><pubDate>Sun, 11 Nov 2007 18:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Sun, 11 Nov 2007 19:21:46 GMT]]></title><description><![CDATA[<p>Du kannst dem Benutzer die Möglichkeit geben, den Thread zu terminieren, falls ihm die Wartezeit zu lange wird, z.B. mittels TerminateThread oder <a href="http://www.microsoft.com/msj/archive/SFFF.aspx" rel="nofollow">KillThrd</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401571</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 11 Nov 2007 19:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Mon, 12 Nov 2007 09:11:43 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort.</p>
<p>Kann man denn überprüfen, ob ein Thread noch läuft?<br />
Gibt es hierfür vielleicht schon eine eingebaute Funktion?</p>
<p>LG<br />
Todd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401737</guid><dc:creator><![CDATA[Todd]]></dc:creator><pubDate>Mon, 12 Nov 2007 09:11:43 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Mon, 12 Nov 2007 09:35:29 GMT]]></title><description><![CDATA[<p>da du das selfdestruct gewählt hast, wird das schwierig, FreeOnTerminate bewirkt das dein Zeiger ins nichts verweist ... wenn du aber darauf verzichtest, kannst du z.B. im c-tor des thread eine variable bool finished mit false initialisieren und die kurz vorm verlassen der execute auf true setzen, in deinem programm kannst du dann einfach diese variable abrufen und dann den thread sauber &quot;von hand&quot; deleten</p>
<p>ansonsten kannst du ja den d-tor des thread überschreiben und ein signal an deine hauptklasse liefern (dann gehts auch mit freeonterminate = true)</p>
<p>ich spinn hier mal was zusammen, du machst n neues Form auf (showmodal) mit text &quot;Aufruf wird bearbeitet&quot;, startest in dem form den thread und übergibst ihm einen pointer auf das form, wenn die execute beendet setzt du im d-tor des thread einfach das modalresult des Form auf OK. dann könntest auch nen abbruch button unterbringen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401743</guid><dc:creator><![CDATA[Ceos]]></dc:creator><pubDate>Mon, 12 Nov 2007 09:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Mon, 12 Nov 2007 12:22:36 GMT]]></title><description><![CDATA[<p>Ich würde dem Thread im Konstruktor eine Callback-Funktion mit übergeben, welche dem Hauptthread das beenden signalisiert. Aufgerufen wird die dann im Destruktor. Dabei muß der eigentliche Thread auch nichts genaues vom Hauptthread wissen.<br />
Bei mir hat eine deratige Funktion immer folgende Signatur</p>
<pre><code class="language-cpp">typedef void CloseCallback(unsigned int, TForm*);
</code></pre>
<p>DDie Funktion kann man dann im Hauptthread global oder als statische Memberfunktion der Form definieren.<br />
Auf die Art braucht man kein Include des Header der Hauptform im Thread.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401807</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 12 Nov 2007 12:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to Multi-Thread Programmierung on Wed, 14 Nov 2007 10:04:24 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort.</p>
<p>Werde dem Hinweis nachgehen und mich evtl. zur gegebenen Zeit wieder melden.</p>
<p>Liebe Grüße<br />
Todd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402952</guid><dc:creator><![CDATA[Todd]]></dc:creator><pubDate>Wed, 14 Nov 2007 10:04:24 GMT</pubDate></item></channel></rss>