<?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[ApplicationEvents + SendMessage]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab hier einen Effekt, den ich mir nicht erklären kann. Ich habe auf Form1 ein TApplicationEvents-Objekt abgelegt und in dessen OnMessage-Ereignis eine Abfrage für eine benutzerdefinierte Nachricht eingefügt.</p>
<p>Wenn ich von einem anderem Form aus, mit PostMessage eine Nachricht absetze, kommt diese in Form1 korrekt an und ich kann sie verarbeiten.<br />
Wenn ich allerdings SendMessage verwende, kommt die Nachricht nicht an. Zumindest nicht im TApplication::OnMessage-Ereignis.</p>
<p>Laut MSDN ist der Unterschied zwischen PostMessage und SendMessage der, dass bei SendMessage auf die Abarbeitung der Nachricht gewartet wird.<br />
Da die Funktion ohne zu warten weiterläuft, wird die Nachricht wohl auch irgendwo verarbeitet. Ich weiß nur nicht an welcher Stelle. Wo mache ich den Denkfehler?</p>
<p>Die Nachricht wird so versendet:</p>
<pre><code class="language-cpp">SendMessage(Application-&gt;Handle, MTESTMESSAGE, 0, 0);
</code></pre>
<p>Die Bahandlung der Nachricht (ist natürlich Nonsens so, aber halt ein Minimalbeispiel zum Testen):</p>
<pre><code class="language-cpp">void __fastcall TForm1::ApplicationEvents1Message(tagMSG &amp;Msg,
		bool &amp;Handled)
{
	switch (Msg.message)
	{
		case MTESTMESSAGE:
			++iMsgCounter;
			Label1-&gt;Caption = AnsiString(iMsgCounter);
			Handled = true;
		break;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/154975/applicationevents-sendmessage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 19:48:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154975.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Aug 2006 12:56:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Tue, 01 Aug 2006 12:56:07 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab hier einen Effekt, den ich mir nicht erklären kann. Ich habe auf Form1 ein TApplicationEvents-Objekt abgelegt und in dessen OnMessage-Ereignis eine Abfrage für eine benutzerdefinierte Nachricht eingefügt.</p>
<p>Wenn ich von einem anderem Form aus, mit PostMessage eine Nachricht absetze, kommt diese in Form1 korrekt an und ich kann sie verarbeiten.<br />
Wenn ich allerdings SendMessage verwende, kommt die Nachricht nicht an. Zumindest nicht im TApplication::OnMessage-Ereignis.</p>
<p>Laut MSDN ist der Unterschied zwischen PostMessage und SendMessage der, dass bei SendMessage auf die Abarbeitung der Nachricht gewartet wird.<br />
Da die Funktion ohne zu warten weiterläuft, wird die Nachricht wohl auch irgendwo verarbeitet. Ich weiß nur nicht an welcher Stelle. Wo mache ich den Denkfehler?</p>
<p>Die Nachricht wird so versendet:</p>
<pre><code class="language-cpp">SendMessage(Application-&gt;Handle, MTESTMESSAGE, 0, 0);
</code></pre>
<p>Die Bahandlung der Nachricht (ist natürlich Nonsens so, aber halt ein Minimalbeispiel zum Testen):</p>
<pre><code class="language-cpp">void __fastcall TForm1::ApplicationEvents1Message(tagMSG &amp;Msg,
		bool &amp;Handled)
{
	switch (Msg.message)
	{
		case MTESTMESSAGE:
			++iMsgCounter;
			Label1-&gt;Caption = AnsiString(iMsgCounter);
			Handled = true;
		break;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1108497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108497</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 01 Aug 2006 12:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Tue, 01 Aug 2006 13:16:29 GMT]]></title><description><![CDATA[<p>Hast du mal nach dem SendMessage() ein Application-&gt;ProcessMessages() ausprobiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108518</guid><dc:creator><![CDATA[WebFritzi]]></dc:creator><pubDate>Tue, 01 Aug 2006 13:16:29 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Tue, 01 Aug 2006 13:21:02 GMT]]></title><description><![CDATA[<p>WebFritzi schrieb:</p>
<blockquote>
<p>Hast du mal nach dem SendMessage() ein Application-&gt;ProcessMessages() ausprobiert?</p>
</blockquote>
<p>Ja, macht aber leider keinen Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108522</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 01 Aug 2006 13:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Tue, 01 Aug 2006 13:37:58 GMT]]></title><description><![CDATA[<p>Und wenn du mal das TApplicationEvents-Objekt weglässt und deine Funktion direkt Application-&gt;OnMessage zuweist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108540</guid><dc:creator><![CDATA[WebFritzi]]></dc:creator><pubDate>Tue, 01 Aug 2006 13:37:58 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Tue, 01 Aug 2006 14:18:34 GMT]]></title><description><![CDATA[<p>Nein, auch dann nicht.</p>
<p>Wenn ich allerdings die WndProc von Form1 überschreibe und die Nachricht direkt an den Handle von Form1 sende, funktioniert es.</p>
<p>Hm, mal sehen, ob mir das hilft. Da muß ich wohl erst noch ein bißchen testen...</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108584</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 01 Aug 2006 14:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Tue, 01 Aug 2006 14:22:58 GMT]]></title><description><![CDATA[<p>Ach so, natürlich. Du kannst die Message auch ganz normal an Form1 schicken und dann in Application-&gt;OnMessage auswerten. Diese Behandlungsroutine fängt <strong>alle</strong> Messages ab, die an irgendwelche Forms gesendet werden. Fazit: du brauchst die WindowProc deiner Form nicht zu überschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108593</guid><dc:creator><![CDATA[WebFritzi]]></dc:creator><pubDate>Tue, 01 Aug 2006 14:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Wed, 02 Aug 2006 06:52:43 GMT]]></title><description><![CDATA[<p>Das geht eben nicht.<br />
Ich komm an die, mit SendMessage verschickten Nachrichten nur, wenn ich die WndProc überschreibe. Das ist es ja, was ich nicht so ganz verstehe, so rein nach dem Lesen der Doku, hätte ich behauptet, dass es egal ist, ob ich PostMessage oder SendMessage verwende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108940</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 02 Aug 2006 06:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Wed, 02 Aug 2006 07:53:54 GMT]]></title><description><![CDATA[<p>Würde ich jetzt auch so denken. Du hast oben aber geschrieben</p>
<pre><code class="language-cpp">SendMessage(Application-&gt;Handle, MTESTMESSAGE, 0, 0);
</code></pre>
<p>und hast gesagt, dass da nichts ankommt. Das ist dann bei folgendem auch so, ja?</p>
<pre><code class="language-cpp">SendMessage(Form1-&gt;Handle, MTESTMESSAGE, 0, 0);
</code></pre>
<p>Vielleicht liegt es ja auch irgendwie an deiner Message...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1108970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1108970</guid><dc:creator><![CDATA[WebFritzi]]></dc:creator><pubDate>Wed, 02 Aug 2006 07:53:54 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Wed, 02 Aug 2006 08:39:23 GMT]]></title><description><![CDATA[<p>Korrekt, weder bei</p>
<pre><code class="language-cpp">SendMessage(Application-&gt;Handle, MTESTMESSAGE, 0, 0);
</code></pre>
<p>noch bei</p>
<pre><code class="language-cpp">SendMessage(Form1-&gt;Handle, MTESTMESSAGE, 0, 0);
</code></pre>
<p>kommt die Nachricht bei den App-Events an.<br />
Sobald PostMessage verwendet wird, funktioniert es mit beiden Handles.<br />
An der Nachricht kann es nicht liegen, definiert ist sie als</p>
<pre><code class="language-cpp">#define MTESTMESSAGE (WM_APP + 400)
</code></pre>
<p>Wenn es weder bei PostMessage, noch bei SendMessage funktionieren würde...</p>
<p>Mit den Nachrichten möchte ich verschiedene Threads durch die Application koordinieren. Bei PostMessage können Nachrichten verloren gehen, ohne dass ich eine Möglichkeit habe das zu prüfen. Bei den maximal alle 5 Sekunden abgesetzen Statusmeldungen ist mir das egal. Aber ich muß gesichert feststellen können, ob ein Thread beendet wurde, oder ein neuer erzeugt wurde.<br />
Nun gut, werde ich eben die WndProc überschreiben... Kann ich durchaus mit leben. Ich hatte nur gehofft, dass das Problem schon mal jemand hatte und mit vielleicht die Hintergründe für dieses Verhalten erklären kann. Vielleicht versuche ich auch die Koordination in einen eigenen Thread zu verlagern, sofern es mir gelingt, in TThread Nachrichten abzufragen. Ich werde mich nachher mal kurz mit GetMessage und PeekMessage beschäftigen.</p>
<p>Vielen Dank für Deine Hilfe, WebFritzi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109000</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 02 Aug 2006 08:39:23 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Wed, 02 Aug 2006 10:50:00 GMT]]></title><description><![CDATA[<p>Wie wärs, wenn du die Koordination nicht über Messages, sondern mit Hilfe von Callback-Funktionen machst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109100</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 02 Aug 2006 10:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Wed, 02 Aug 2006 13:19:57 GMT]]></title><description><![CDATA[<p>Öh. Du hast mich hängen. Ich wüßte nicht, wie mir eine Callback-Funktion hier helfen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109231</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 02 Aug 2006 13:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Wed, 02 Aug 2006 13:33:20 GMT]]></title><description><![CDATA[<p>Ich weiß nun nicht genau was du machen willst.<br />
Ich hab mir das so gedacht.<br />
Du definierst im Hauptthread eine CallBackfunktion, die du deinem Nebenthrad übergibst. Das könnte eine externe Funktion oder auch eine statische Memberfunktion einer Klasse sein. Diese Funktion benötigt evtl noch einen Pointer auf die Hauptthreadklasse und/oder die nebenthreadklasse (kann auch auf dessen Basisklasse sein). Dann rufst du diese Funktion im Nebenthread bei Bedarf einfach auf.<br />
Ich mach das bei mir zumindest so um das Schliessen des Nebenthreads zu signalisieren (in OnClose oder im Destruktor des Nebenthreads).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109246</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 02 Aug 2006 13:33:20 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Wed, 02 Aug 2006 14:00:58 GMT]]></title><description><![CDATA[<p>Ich sehe schon, in Punkto Threads brauch ich wohl noch ein bißchen Nachhilfe.<br />
Bisher habe ich so etwas mittels TThread::Synchronize() und TThread::OnTerminate() gemacht. Wobei beides als recht inperformant einzustufen ist. Die Idee mit den Messages hatte ich, als ich nach einer Möglichkeit gesucht habe, das Synchronize für das UI-Update zu ersetzen. Und da das mit den Nachrichten sehr gut funktioniert hat, hab ich ein bißchen weiter experimentiert. Dabei habe ich dann festgestellt, dass leider Nachrichten verloren gehen können, wenn der Application-Thread ausgelastet ist und hab versucht die wichtigen Nachrichten per SendMessage zu versenden...</p>
<p>Werd ich mal ausprobieren. Diese Woche aber nicht mehr, da ich eben noch eine Änderung für ein anderes Projekt aufgedrückt bekommen habe...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109269</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 02 Aug 2006 14:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Thu, 03 Aug 2006 04:36:54 GMT]]></title><description><![CDATA[<p>Das mit dem Callback hat nur eine grosse Nase: Du hälst dir damit den Thread wieder auf. Die Callbacks müssten also so kurz wie möglich sein, während du mit der Nachrichtenverarbeitung und z.B. PostMessage eine sehr lose Kopplung erreichen würdest.</p>
<p>Was mir spontan auffällt ist, dass deine Testnachricht nicht 400 über WM_USER sondern über WM_APP liegt. Ich habe bisher immer nur mit WM_USER gearbeitet... Wobei ich grade gelesen habe, dass WM_APP auch für Custom-Nachrichten wäre. Mit welcher VCL-Version arbeitetst du? Version 6?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109605</guid><dc:creator><![CDATA[UnEinloggbar]]></dc:creator><pubDate>Thu, 03 Aug 2006 04:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to ApplicationEvents + SendMessage on Thu, 03 Aug 2006 06:31:08 GMT]]></title><description><![CDATA[<p>UnEinloggbar schrieb:</p>
<blockquote>
<p>Das mit dem Callback hat nur eine grosse Nase: Du hälst dir damit den Thread wieder auf.</p>
</blockquote>
<p>Ja, das muß ich wohl in Kauf nehmen, da bei PostMessage Nachrichten verloren gehen können. Praktisch ist für meine Anwendung nur wichtig, zu erfahren, wann ein Thread beendet ist. Ob ich das nun über SendMessage, oder eine Callback-Funktion mache, dürfte keinen großen Unterschied machen, da der Thread bei beiden Varianten wartet. Die anderen Nachrichten werde ich weiterhin über PostMessage absetzen. Die können auch ruhig verloren gehen, da sie nur Statusmeldungen sind (Thread gestartet, Thread angehalten, Prozent fertig) und nur für das UI verwendet werden.<br />
Aber ich werde noch testen, ob in einem Controller-Thread die mit PostMessage vesendeten Nachrichten auch verloren gehen. Die Nachrichten gehen nämlich immer dann verloren, wenn ich in der MainForm, welche auch die Nachrichten verarbeitet, irgendetwas mache (das Form verschieben, in den ListBoxen scrollen...).</p>
<p>UnEinloggbar schrieb:</p>
<blockquote>
<p>Was mir spontan auffällt ist, dass deine Testnachricht nicht 400 über WM_USER sondern über WM_APP liegt.</p>
</blockquote>
<p>Ob WM_APP, oder WM_USER dürfte keine Rolle spielen, solange ich die Nachrichten nur Anwendungsintern versende.</p>
<p>UnEinloggbar schrieb:</p>
<blockquote>
<p>Mit welcher VCL-Version arbeitetst du? Version 6?</p>
</blockquote>
<p>Ja, ich hab noch den BCB 6.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109619</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 03 Aug 2006 06:31:08 GMT</pubDate></item></channel></rss>