<?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[Canvas Does Not Allow Drawing]]></title><description><![CDATA[<p>Hallo mal wieder.</p>
<p>Ich hoffe, dass ihr mir weiterhelfen könnt. Ich habe folgenden Programmaufbau:</p>
<pre><code class="language-cpp">void __fastcall (__closure *OnReceive)(HANDLE hPipe, char *buf, int BytesRead);

void __fastcall TPipeServer::FOnReceive(HANDLE hPipe,char *chRequest, int cbBytesRead)
{
	if (OnReceive) {
		(OnReceive)(hPipe,chRequest,cbBytesRead);
	}
//    MessageBox(NULL,chRequest, &quot;&quot;, MB_OK);
}
//---------------------------------------------------------------------------
</code></pre>
<p>Die Funktion FOnReceive wird in einem Thread meiner Klasse TPipeServer ausgelöst. Der Thread wurde mit CreateThread erstellt. Ich habe also (glaube ich zumindest) keinen Zugriff auf die Funktion Synchronize.<br />
Bei OnReceive handelt es sich um einen Funktionszeiger, der auf die Funktion mOnReceive in der VCL-Anwendung verweist.</p>
<pre><code class="language-cpp">TPipeServer ps;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ps = new TPipeServer(&quot;MappsPipe&quot;);
ps-&gt;Activate();
ps-&gt;OnReceive = mOnReceive;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::mOnReceive(HANDLE hPipe,char *chRequest, int cbBytesRead)
{
//Form1-&gt;Canvas-&gt;Lock(); Funktioniert leider auch nicht :(
ShowMessage(String(chRequest));
}
</code></pre>
<p>Es passiert also folgendes:<br />
1. Die Klasse TPipeServer wird initialisiert.<br />
2. Der Funktionszeiger OnReceive wird auf die Funktion mOnReceive gesetzt.<br />
3. In einem EIGENEN Thread wird die Pipe ausgelesen. Ist der Vorgang erfolgreich ruft der Thread die Funktion FOnReceive auf.<br />
4. FOnReceive soll jetzt TForm1::mOnReceive ausführen und den gelesenen Text anzeigen</p>
<p>Hier liegt nun das Problem. Die Exception mit der Nachricht &quot;Canvas does not allow drawing&quot; wird ausgelöst. Was muss ich ändern, damit dieser Fehler nicht mehr eintritt?</p>
<p>Vielen Dank,</p>
<p>Mapp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/164067/canvas-does-not-allow-drawing</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 07:39:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/164067.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 04 Nov 2006 18:26:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Canvas Does Not Allow Drawing on Sat, 04 Nov 2006 18:26:27 GMT]]></title><description><![CDATA[<p>Hallo mal wieder.</p>
<p>Ich hoffe, dass ihr mir weiterhelfen könnt. Ich habe folgenden Programmaufbau:</p>
<pre><code class="language-cpp">void __fastcall (__closure *OnReceive)(HANDLE hPipe, char *buf, int BytesRead);

void __fastcall TPipeServer::FOnReceive(HANDLE hPipe,char *chRequest, int cbBytesRead)
{
	if (OnReceive) {
		(OnReceive)(hPipe,chRequest,cbBytesRead);
	}
//    MessageBox(NULL,chRequest, &quot;&quot;, MB_OK);
}
//---------------------------------------------------------------------------
</code></pre>
<p>Die Funktion FOnReceive wird in einem Thread meiner Klasse TPipeServer ausgelöst. Der Thread wurde mit CreateThread erstellt. Ich habe also (glaube ich zumindest) keinen Zugriff auf die Funktion Synchronize.<br />
Bei OnReceive handelt es sich um einen Funktionszeiger, der auf die Funktion mOnReceive in der VCL-Anwendung verweist.</p>
<pre><code class="language-cpp">TPipeServer ps;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ps = new TPipeServer(&quot;MappsPipe&quot;);
ps-&gt;Activate();
ps-&gt;OnReceive = mOnReceive;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::mOnReceive(HANDLE hPipe,char *chRequest, int cbBytesRead)
{
//Form1-&gt;Canvas-&gt;Lock(); Funktioniert leider auch nicht :(
ShowMessage(String(chRequest));
}
</code></pre>
<p>Es passiert also folgendes:<br />
1. Die Klasse TPipeServer wird initialisiert.<br />
2. Der Funktionszeiger OnReceive wird auf die Funktion mOnReceive gesetzt.<br />
3. In einem EIGENEN Thread wird die Pipe ausgelesen. Ist der Vorgang erfolgreich ruft der Thread die Funktion FOnReceive auf.<br />
4. FOnReceive soll jetzt TForm1::mOnReceive ausführen und den gelesenen Text anzeigen</p>
<p>Hier liegt nun das Problem. Die Exception mit der Nachricht &quot;Canvas does not allow drawing&quot; wird ausgelöst. Was muss ich ändern, damit dieser Fehler nicht mehr eintritt?</p>
<p>Vielen Dank,</p>
<p>Mapp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1168455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1168455</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Sat, 04 Nov 2006 18:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas Does Not Allow Drawing on Mon, 06 Nov 2006 16:27:47 GMT]]></title><description><![CDATA[<p>Hallöchen!</p>
<p>Hat einer von euch schonmal so etwas programmiert? Ich vermute mal, dass es sich tatsächlich um ein Synchronisationproblem zwischen MainThread und meinem externen Thread handelt.</p>
<p>Wie kann ich die beiden Threads synchronisieren?</p>
<p>Thx</p>
<p>Mapp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1169824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1169824</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Mon, 06 Nov 2006 16:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas Does Not Allow Drawing on Mon, 06 Nov 2006 16:37:43 GMT]]></title><description><![CDATA[<p>luag mal in der Doku: hats da TCanvas::Lock() oder so<br />
vielleicht auch interessant ist TCriticalSection oder so wenn du selber synchronisieren willst, ausserdem TThread::Synchronize()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1169836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1169836</guid><dc:creator><![CDATA[schubidu]]></dc:creator><pubDate>Mon, 06 Nov 2006 16:37:43 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas Does Not Allow Drawing on Mon, 06 Nov 2006 21:33:22 GMT]]></title><description><![CDATA[<p>hmmm <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>1. TThread kann ich nicht benutzen.</p>
<blockquote>
<p>Der Thread wurde mit CreateThread erstellt. Ich habe also (glaube ich zumindest) keinen Zugriff auf die Funktion Synchronize.</p>
</blockquote>
<p>2.</p>
<blockquote>
<p>//Form1-&gt;Canvas-&gt;Lock(); Funktioniert leider auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Was mache ich falsch?<br />
3. Ich werde mal schauen, ob ich eine WinApi-Alternative zu TCriticalSection (vermutlich CriticalSection :)) finde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170080</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Mon, 06 Nov 2006 21:33:22 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas Does Not Allow Drawing on Mon, 06 Nov 2006 21:53:22 GMT]]></title><description><![CDATA[<p>TCriticalSection behebt den Fehler auch nicht. Welchen Bereich in dem Code würdet ihr denn absichern? Ich habe schon versucht entweder den Code in FOnReceive oder mOnReceive folgendermaßen abzusichern:</p>
<pre><code class="language-cpp">TCriticalSection *cs = new TCriticalSection() // global in der Klasse TPipeServer bzw. TForm1 definiert

void __fastcall Class::Funktion()
{
cs-&gt;Aquire();
ShowMessage(&quot;bla&quot;);
cs-&gt;Release();
}
</code></pre>
<p>Beide Versuche sind leider erfolglos geblieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170091</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Mon, 06 Nov 2006 21:53:22 GMT</pubDate></item></channel></rss>