<?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[Multitasking]]></title><description><![CDATA[<p>Grüße <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Ich wüsste gern wie ich Multitasking-Programme schreiben kann.<br />
z.B.:Eine Zeitzählfunktion läuft neben dem Hauptprogramm.<br />
Wenn man dann auf einen Button im Fenster klickt wird die gezählte Zeit angezeigt.<br />
(also auch Variablenübertragung)</p>
<p>Kann mir da einer helfen?</p>
<p>Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/118330/multitasking</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 09:17:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118330.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Aug 2005 12:06:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 12:06:20 GMT]]></title><description><![CDATA[<p>Grüße <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Ich wüsste gern wie ich Multitasking-Programme schreiben kann.<br />
z.B.:Eine Zeitzählfunktion läuft neben dem Hauptprogramm.<br />
Wenn man dann auf einen Button im Fenster klickt wird die gezählte Zeit angezeigt.<br />
(also auch Variablenübertragung)</p>
<p>Kann mir da einer helfen?</p>
<p>Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854147</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Wed, 17 Aug 2005 12:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 12:16:27 GMT]]></title><description><![CDATA[<p>ups des ist gar net so einfach:<br />
Wenns &quot;echtes&quot; multitasking sein soll kommst du um POSIX-threads leider nicht<br />
herum und dann variablen zwischen den einzelnen (leight-weight-)prozessen<br />
auszutauschen ist gar net so einfach. Unter Linux/Unix kannst du auch den<br />
forkbefehl verwenden um multitasking zu implementieren.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/854159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854159</guid><dc:creator><![CDATA[rene1]]></dc:creator><pubDate>Wed, 17 Aug 2005 12:16:27 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 12:31:38 GMT]]></title><description><![CDATA[<p>Naja, was heißt es ist nicht einfach? Im Prinzip ist es sehr einfach.</p>
<p>Welche GUI-API benutzt du denn? MFC, Win32, Qt, wxWidgets oder was? Die haben alle Multithreading im Angebot.</p>
<p>Ansonst gibts halt noch boost::thread. Mußt du natürlich die <a href="http://www.boost.org" rel="nofollow">Boost Libs</a> haben.</p>
<p>Hier ist ein dt. Tut von mir: <a href="http://www.kharchi.de/threads.html" rel="nofollow">http://www.kharchi.de/threads.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/854170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854170</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Wed, 17 Aug 2005 12:31:38 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 14:43:42 GMT]]></title><description><![CDATA[<p>und wie tauschen die einzelnen threads daten aus (pipe,shared memory,usw)<br />
mit der boost-library, wie wird der daten-austausch synchroniesiert? ist des<br />
auch einfach?btw. wenn man Qt kommerziell verwendet kommen nicht<br />
ganz unmaßgebliche license-gebühren auf einen zu <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>
]]></description><link>https://www.c-plusplus.net/forum/post/854291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854291</guid><dc:creator><![CDATA[rene1]]></dc:creator><pubDate>Wed, 17 Aug 2005 14:43:42 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 15:20:15 GMT]]></title><description><![CDATA[<p>Lies dir am besten mal die Doku von Boost dazu durch.<br />
Hab ich heute auch. Anscheinend tut<br />
man einfach die Entsprechenden klassen mit einem Mutex<br />
'bestücken', und erzeugt in den Memberfunktionen<br />
jeweils locking Objekte, die das Objekt nach<br />
dem Verlassen der Funktion automatisch wieder<br />
freigeben. Somit wird verhindert das man vergisst<br />
ein Objekt wieder zu unlocken.</p>
<p><a href="http://boost.org/doc/html/threads.html" rel="nofollow">http://boost.org/doc/html/threads.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/854320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854320</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Wed, 17 Aug 2005 15:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 19:02:51 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Ich wüsste gern wie ich Multitasking-Programme schreiben kann.<br />
z.B.:Eine Zeitzählfunktion läuft neben dem Hauptprogramm.<br />
Wenn man dann auf einen Button im Fenster klickt wird die gezählte Zeit angezeigt.<br />
(also auch Variablenübertragung)</p>
</blockquote>
<p>boost.thread ist schon mal ein guter Tipp. Erstens ist es plattform-übergreifend und zweitens einfacher, als sich z.B. mit einer Win-API herumzuschlagen.</p>
<p>Mal angenommen, da ist eine Zähler-Klasse, die im einfachsten Fall etwa so aussieht:</p>
<pre><code class="language-cpp">#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread.hpp&gt;

class Zaehler
{
public:
    Zaehler()
        : m_isRunning( true )
        , m_count( 0 )
        , m_thread( boost::bind( &amp;Zaehler::Run, this ) )
        // compiler warning ignorieren, wenn m_thread letztes Member
    {}

    ~Zaehler()
    {
        m_isRunning = false; // Beenden des Threads ist notwendig
        m_thread.join();
    }

    int Count() const 
    {
        return m_count;
    }

private:
    void Run() // hier drin rennt mein Thread
    {
        for(; m_isRunning; ++m_count )
        {
            // mache hier was auch immer
            // z.B. 1 Sekunde schlafen (sleep)
        }
    }

    // --   Member
    bool m_isRunning;
    int m_count;
    boost::thread m_thread; // MUSS letztes Member sein
};
</code></pre>
<p>dann trägt 'Zaehler' einen Member m_thread, der die Methode Zaehler::Run in einem eigenen Thread laufen läßt. Wie Du siehst funktioniert das mit der Datenübertragung hier einfach so, dass beide Threads - also der Haupt-Thread und der Thread von m_thread einfach auf die Member des identischen Objekts zugreifen.<br />
Das geht hier nur deshalb gut, weil immer nur einer von beiden schreibt und beide Variablen (m_count, m_isRunning) einfache Datentypen sind, bei denen das Lesen nicht durch einen Threadwechsel unterbrochen wird (so hoffe ich <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>Beim Übersetzen bekommt man eine Compiler-Warning (zu Recht), da this als Parameter für einen der Member benutzt wird. Im Konstruktor von boost::thread rennt dieser gleich los und zu diesem Zeitpunkt müssen alle Member der Klasse initialisiert sein; daher muss m_thread das letzte Member sein.</p>
<p>Ein Objekt dieser Klasse kannst Du als Member eines Windows oder Dialoges setzen. Der Thread startet sobald das Window oder Dialog-Objekt angelegt ist. Danach kann man dann in einer On-Button-Klick-Methode einfach den Zähler-Stand mit Count() abfragen.</p>
<p>Wird die Klasse anspruchsvoller, so solltest Du die Member mit einem Mutex schützen. Dazu fügt man ein Mutex als Member hinzu:</p>
<pre><code class="language-cpp">// --   Member
    mutable boost::mutex m_guard;
</code></pre>
<p>den macht man am besten gleich mutable, damit man auch const-Methoden schützen kann.<br />
So wird dann Count angepasst:</p>
<pre><code class="language-cpp">int Count() const 
    {
        boost::mutex::scoped_lock lock( m_guard );
        return m_count;
    }
</code></pre>
<p>und damit das ganze überhaupt Sinn macht, darf auch der eigenen Thread nur an m_count bzw. weitere (Nutz-)Member ran, wenn sonst keiner die Hand drauf hat - also das Mutex es zulässt:</p>
<pre><code class="language-cpp">void Run()
    {
        for(; m_isRunning;)
        {
            boost::mutex::scoped_lock lock( m_guard );
            // hier immer noch irgendwas tun, ..
            ++m_count; // auf 'm_count' exclusiv schreiben
        }
    }
</code></pre>
<p>boost ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /><br />
Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854423</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 17 Aug 2005 19:02:51 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 20:19:26 GMT]]></title><description><![CDATA[<p>was spricht dagegen, in der Run() - funktion ein lokale thread-instanz zu erstellen, die eine zweite funktion (DoWork() o.ä.) in einem neuen thread startet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854452</guid><dc:creator><![CDATA[&#x27;&#x27;&#x27;m&#x27;&#x27;&#x27;]]></dc:creator><pubDate>Wed, 17 Aug 2005 20:19:26 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 20:42:36 GMT]]></title><description><![CDATA[<p>'''m''' schrieb:</p>
<blockquote>
<p>was spricht dagegen, in der Run() - funktion ein lokale thread-instanz zu erstellen, die eine zweite funktion (DoWork() o.ä.) in einem neuen thread startet?</p>
</blockquote>
<p>Dagegen spricht, dass von dieser lokalen Instanz am Ende von Run() der Destruktor aufgerufen wird. Es gibt zwei Möglichkeiten:<br />
1.) Warte in Run() bis der Thread in DoWork() fertig ist; dann ist der Thread unnötig, man kann DoWork direkt aufrufen.<br />
2.) Warte nicht, dann wird der Destruktor von boost::thread gerufen, der z.B. in Windows zu einem CloseHandle auf den Thread-Handle führt; bedeutet Freigabe der Ressourcen bei laufendem Thread - das kann eigentlich nur schiefgehen.</p>
<p>Preisfrage: Was würde dafür sprechen, wie ist Deine Idee?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/854466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854466</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 17 Aug 2005 20:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to Multitasking on Wed, 17 Aug 2005 22:27:39 GMT]]></title><description><![CDATA[<p>ich hatte eigentlich 2. im sinn. aber wenn die ressourcen freigegeben werden, ist natürlich blöd.<br />
ich habe da</p>
<blockquote>
<p>~thread();</p>
<p>Effects: Destroys *this. The actual thread of execution may continue to execute after the thread object has been destroyed.</p>
</blockquote>
<p>wohl was missverstanden.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/854530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/854530</guid><dc:creator><![CDATA[&#x27;&#x27;&#x27;m&#x27;&#x27;&#x27;]]></dc:creator><pubDate>Wed, 17 Aug 2005 22:27:39 GMT</pubDate></item></channel></rss>