<?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[lparam und MSG]]></title><description><![CDATA[<p>Moin!</p>
<p>Ich glaube ich habe zu schlecht geschlafen... Ich krieg heut echt NULL auf die Reihe. (Man bemerke die kleine Anspielung :D)</p>
<p>Also mein Problem ist:</p>
<p>Ich habe diverse Threads.</p>
<p>Thread A, ein Formular und einen Thread B.</p>
<p>Thread A rennt.<br />
Formular rennt.<br />
Thread B schläft mit GetMessage.</p>
<p>Folgendes wird passieren:</p>
<p>Thread A feuert mit PostThreadMessage eine Nachricht an B.<br />
B wacht auf und führt mittels Synchronize im Formular was aus.</p>
<p>Grund für diese Variante ist einfach zEitersparnis. Ich hab gemessen. Wenn ich das so mach muss ich nicht im Formular alles mit Mutexen vollknallen.<br />
Bzw. hab ich noch ned nachgeschaut wie ich Nachrichten an einen TForm Thread schicke.</p>
<p>Egal. Das Ganze mach ich eben mit MSG, PostThreadMessage und GetMessage. also API Funktionalität.</p>
<p>Aber nun zu meinem Problem. Ich muss eine Datenvariable rüberbringen.</p>
<p>int* zahl;<br />
PostThreadMessage(x,x,x,zahl);</p>
<p>GetMEssage(MSG,,,);</p>
<p>etc blabla is ja klar...</p>
<p>So und dann</p>
<p>int* zahlparameter = (int*) Msg.lparam;</p>
<p>Soweit so gut... Is ja OK mit Pointern...</p>
<p>ABER in der Zwischenzeit ist A ja weiter geflitzt. Also kann sich der Inhalt des Zeigers 5x geändert haben...</p>
<p>Ich raffs aber grad ned wie ich ne stink normale Variable übergeb oder so. Normale Parameterübergabe macht ja ne Kopie...</p>
<p>Handelt sich bürgiends nicht um ne int.... das war nur ein Bleistift.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183988/lparam-und-msg</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 19:10:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183988.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jun 2007 10:16:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to lparam und MSG on Mon, 11 Jun 2007 10:16:00 GMT]]></title><description><![CDATA[<p>Moin!</p>
<p>Ich glaube ich habe zu schlecht geschlafen... Ich krieg heut echt NULL auf die Reihe. (Man bemerke die kleine Anspielung :D)</p>
<p>Also mein Problem ist:</p>
<p>Ich habe diverse Threads.</p>
<p>Thread A, ein Formular und einen Thread B.</p>
<p>Thread A rennt.<br />
Formular rennt.<br />
Thread B schläft mit GetMessage.</p>
<p>Folgendes wird passieren:</p>
<p>Thread A feuert mit PostThreadMessage eine Nachricht an B.<br />
B wacht auf und führt mittels Synchronize im Formular was aus.</p>
<p>Grund für diese Variante ist einfach zEitersparnis. Ich hab gemessen. Wenn ich das so mach muss ich nicht im Formular alles mit Mutexen vollknallen.<br />
Bzw. hab ich noch ned nachgeschaut wie ich Nachrichten an einen TForm Thread schicke.</p>
<p>Egal. Das Ganze mach ich eben mit MSG, PostThreadMessage und GetMessage. also API Funktionalität.</p>
<p>Aber nun zu meinem Problem. Ich muss eine Datenvariable rüberbringen.</p>
<p>int* zahl;<br />
PostThreadMessage(x,x,x,zahl);</p>
<p>GetMEssage(MSG,,,);</p>
<p>etc blabla is ja klar...</p>
<p>So und dann</p>
<p>int* zahlparameter = (int*) Msg.lparam;</p>
<p>Soweit so gut... Is ja OK mit Pointern...</p>
<p>ABER in der Zwischenzeit ist A ja weiter geflitzt. Also kann sich der Inhalt des Zeigers 5x geändert haben...</p>
<p>Ich raffs aber grad ned wie ich ne stink normale Variable übergeb oder so. Normale Parameterübergabe macht ja ne Kopie...</p>
<p>Handelt sich bürgiends nicht um ne int.... das war nur ein Bleistift.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302985</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Mon, 11 Jun 2007 10:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Mon, 11 Jun 2007 11:07:58 GMT]]></title><description><![CDATA[<p>Diese ganzen Personifikationen ... <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>
<p>Also bei PostThreadMessage musst Du erstmal darauf achten, dass die Nachricht gesendet wird und anschließend nicht gewartet wird, bis diese bearbeitet wird. Die Funktion retuniert sofort! Das ist wichtig, wenn Du Zeiger auf Bereiche übergibst, die nur im Thread konsistent sind.<br />
Bzw. des Änderns der Daten, ... da musst Du einfach sychronisieren, evtl. ist es schneller ein neues unabhängiges Synch-Objekt zu erstellen (Critical-Section), damit das ganze etwas schneller läuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303035</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Mon, 11 Jun 2007 11:07:58 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Mon, 11 Jun 2007 14:13:27 GMT]]></title><description><![CDATA[<p>CodeFinder schrieb:</p>
<blockquote>
<p>Diese ganzen Personifikationen ... <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>
</blockquote>
<p>Que?</p>
<blockquote>
<p>Also bei PostThreadMessage musst Du erstmal darauf achten, dass die Nachricht gesendet wird und anschließend nicht gewartet wird, bis diese bearbeitet wird. Die Funktion retuniert sofort! Das ist wichtig, wenn Du Zeiger auf Bereiche übergibst, die nur im Thread konsistent sind.</p>
</blockquote>
<p>Wenn du damit sagen willst, daß es mit Pointern als Parameter Probleme gibt... GENAU das is eine Frage wie ich drumrum komm... Denn Thread A WIRD weiter laufen und er WIRD den Inhalt des Zeigers ändern. Deswegen überhaupt mein Post.</p>
<blockquote>
<p>Bzw. des Änderns der Daten, ... da musst Du einfach sychronisieren, evtl. ist es schneller ein neues unabhängiges Synch-Objekt zu erstellen (Critical-Section), damit das ganze etwas schneller läuft.</p>
</blockquote>
<p>Unabhängig in welchem Sinne? Also Die Verwendung einer TCriticalSection bzw. eines TSynchroObjects (Wobei wir aus der Api rausflutschen mit den beiden Klassen.... Aber die sind ja auch nur Implementierungen der API...)<br />
Hat mich mehrere Millisekunden gekostet! Denn da meine Elemente auf die ich zugreife Teil des Formulars sind, werde ich jeden achso kleinen Zugriff sichern müssen. Was mich ausbremst... Also wenn ich einen Thread nur Posten lasse, wobei Thread B default Werte im Formular schreibt, brauch ich bis zu 7ms... Mach ichs über Synchronize komplett ohne diverse Objekte, 1ms, wenn überhaupt. Denn das Anhalten des Formular Threads ist schneller als jedesmal Lock und Unlock... Ich habs ausgemessen....</p>
<p>Sinn ist eben, daß ich von irgendwoher mehrere Strings in das Formular kriegen muss und dort in ein Array bzw. ListView packen. Das Formular sichert aber auch das Array bzw. das ListView... Also greift es auch lesend und schriebend zu.</p>
<p>Sprich ich müsste ohne Synchronize jeeeeden Zugriff absichern. Und das frisst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303187</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Mon, 11 Jun 2007 14:13:27 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Mon, 11 Jun 2007 14:39:28 GMT]]></title><description><![CDATA[<p>Shogun schrieb:</p>
<blockquote>
<p>Que?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<blockquote>
<p>Thread A rennt.<br />
Formular rennt.<br />
Thread B schläft mit GetMessage.</p>
</blockquote>
<p>Shogun schrieb:</p>
<blockquote>
<p>Wenn du damit sagen willst, daß es mit Pointern als Parameter Probleme gibt... GENAU das is eine Frage wie ich drumrum komm... Denn Thread A WIRD weiter laufen und er WIRD den Inhalt des Zeigers ändern. Deswegen überhaupt mein Post.</p>
</blockquote>
<p>Es muss nicht grundsätzlich Probleme geben. Es geht. Man muss eben nur dafür sorgen, dass der adressierte Bereich auch gültig ist/bleibt. Wenn er sich ändert *MUSST* Du synchronisieren, da geht kein Weg dran vorbei.</p>
<p>Shogun schrieb:</p>
<blockquote>
<p>Sprich ich müsste ohne Synchronize jeeeeden Zugriff absichern. Und das frisst.</p>
</blockquote>
<p>Da kommst Du nicht drum herum... das ist der Nachteil von Multithreading.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303223</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Mon, 11 Jun 2007 14:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Mon, 11 Jun 2007 15:07:00 GMT]]></title><description><![CDATA[<p>Ausser ich krich irgendwie meine PArameter rüber ohne Zeiger zu verwenden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303264</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Mon, 11 Jun 2007 15:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Mon, 11 Jun 2007 16:58:24 GMT]]></title><description><![CDATA[<p>Bei primitiven Typen ist das auch möglich, aber deren Kapazitäten reichen ja meistens nicht :p .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303358</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Mon, 11 Jun 2007 16:58:24 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Tue, 12 Jun 2007 05:51:41 GMT]]></title><description><![CDATA[<p>Mhm leider...Ich müsste so 5-6 Strings rüberkriegen. *argh*</p>
<p>Evtl. Mach ichs anders.<br />
Ich verwende eine Critical Section in B. Locke die von A aus. Rufe eine Fire Funktion in B auf, die erst die Membervariablen setzt und dann Synchronize aufruft. Dann mache ich mein Unlock...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303676</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Tue, 12 Jun 2007 05:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Tue, 12 Jun 2007 06:30:30 GMT]]></title><description><![CDATA[<p>Evtl. ist es performanter. Einfach eine Queue zu verwenden, in die die Daten angehängt werden undnur einen PostMessage für die Benachrichtigung. Die Queue wird dann über eine CrticalSection abgesichert, von beiden Threads aus natürlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303690</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 12 Jun 2007 06:30:30 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Tue, 12 Jun 2007 07:45:32 GMT]]></title><description><![CDATA[<p>Hmmm... Ne List aus der STL als FIFO benutzen meinst du?</p>
<p>Rein Theoretisch kommen die sich doch nicht in die Quere, so daß ich das nichtmal absichern müsste oder?</p>
<p>Das Problem ist: Es gibt mehrererererere Thread A. Die das alle wollen.</p>
<p>Wenn ich doch eine list mache. Mit jedem Post Message schnappt der sich das Erste Element der Liste, liesst es und löscht es. Thread A kann doch dann fröhlich append mit der Liste machen oder? Er hängt ja nur hintendran.</p>
<p>Oops... Ich nehms zurück... Wenn da zwei A gleichzeitig rein wollen gibts gehakel. Also doch absichern. Aber das mit der Fifo Liste als Queue ist ne Klasse Idee...</p>
<p>B mit ner Critical Section sichern. In B eine list einbauen. Und B Nimmt sich bei jedem PostThreadMessage das Letzte Element.</p>
<p>Das Senden funktioniert dann so:</p>
<p>lock<br />
list.append<br />
postthreadmessage<br />
unlock</p>
<p>Senden im Lock, damit nicht ein andrer Thread reinpfuscht.</p>
<p>DAs ist so wie du es meinst oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303719</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Tue, 12 Jun 2007 07:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Tue, 12 Jun 2007 07:45:30 GMT]]></title><description><![CDATA[<p>Mit Sicherheit kostet dieses Verfahren weitaus weniger Performance als ein SendMessage. Die Critical Section ist nur im Konflikt langsam!<br />
Alle anderen Mechanismen wie SendMessage über Threadgrenzen hinweg sind weitaus extremer.<br />
Ich wundere mich jedesmal, das solche Konstrukte gebastelt werden.</p>
<p>Noch effektiver ist wenn nicht mal die Message Queue verwendet wird sondern einfach ein Event. Oder Du kannst den lesenden Thread sogar per Timer einfach zyklisch nach sehen lassen ob was zu tun ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303720</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 12 Jun 2007 07:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to lparam und MSG on Tue, 12 Jun 2007 07:52:04 GMT]]></title><description><![CDATA[<p>Ich dachte bisher das Pollen wäre langsamer?</p>
<p>Ja per Event hab ich auch überlegt. Ich traue den Message Queues irgendwie nicht so ganz...</p>
<p>Allerdings brauche ich doch dann die Liste nicht mehr oder?</p>
<p>A:<br />
lock<br />
set list item<br />
raise event<br />
unlock</p>
<p>B:<br />
waitfor(event)<br />
lock<br />
read list item<br />
delete list item<br />
reset event<br />
unlock</p>
<p>Diese Variante blockiert doch die Liste sowieso, so daß nur ein Element drin landen kann.<br />
Ausser in genau der Zeit zwischen A unlock und B lock flitzt ein anderer A Thread da rein und macht schnell ein append. Das wäre natürlich ein Grund für die Liste.</p>
<p>Brauche ich da überhaupt eine Liste? Reicht da nicht ein Objekt in B, statt einer Liste?</p>
<p>Alternative wäre dann</p>
<p>A:<br />
lock<br />
setappendraise event<br />
unlock</p>
<p>B:<br />
waitfor(event)<br />
lock<br />
hwile (listengrüße nicht erreicht)<br />
read list item<br />
delete list item<br />
reset event<br />
unlock</p>
<p>EDIT: Gehört das nicht so langsam in Rund um die Programmierung?`Ist ja eine Grundlagenfrage, die sich überall stellt. Egal welche Bibliothek...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303724</guid><dc:creator><![CDATA[Shogun]]></dc:creator><pubDate>Tue, 12 Jun 2007 07:52:04 GMT</pubDate></item></channel></rss>