<?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[Button aus einem Thread heraus auf enabled setzen]]></title><description><![CDATA[<p>Hallo allerseits!</p>
<p>Ich habe ein Problem bei folgendem:</p>
<p>Beim beenden eines Threads soll ein Button, der kurz vorm Starten des threads auf disabled gesetzt wurde, wieder enabled werden.</p>
<p>Ich habe schon verschiedenes probiert, aber ohne Erfolg:</p>
<pre><code class="language-cpp">UINT CiterundvisDlg::thrFunction(LPVOID pParam)
{
...
 while (*pFlag)  		
 {			
..
 }
...
GetDlgItem(IDC_BUTTON4)-&gt;EnableWindow(TRUE);
return 0;
}
</code></pre>
<p>was liefert:</p>
<blockquote>
<p>error C2352: 'CWnd::GetDlgItem' : illegal call of non-static member function<br />
C:\Programme\Microsoft Visual Studio 8\VC\atlmfc\include\afxwin.h(2074) : see declaration of 'CWnd::GetDlgItem'</p>
</blockquote>
<p>aber das GetGlgItem nicht statisch ist, daran kann ich ja nichts ändern, oder?</p>
<p>Auch habe ich probiert:</p>
<pre><code class="language-cpp">UINT CiterundvisDlg::thrFunction(LPVOID pParam)
{
...
 while (*pFlag)  		
 {			
..
 }
...
CiterundvisDlg::m_feldgrbutton.SetState( TRUE );
return 0;
}
</code></pre>
<p>wobei m_feldgrbutton eine Variable vom Typ CButton ist.<br />
Dort bekomme ich allerdings nur:</p>
<blockquote>
<p>error C2228: left of '.SetState' must have class/struct/union</p>
</blockquote>
<p>wobei ich nicht ganz verstehe, was der Unterschied zum m_Checkbutton Beispiel <a href="http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel17.htm" rel="nofollow">dort</a> ist.<br />
<em>(Und ich weiß: Das würde den Button sowieso nicht enablen, das war nur ein prinzipieller Versuch...)</em></p>
<p>Welche Möglichkeit bleibt also noch?<br />
Wa kann ich tun, um den Button vom Threadende aus in den enabled Zustand zu versetzen?</p>
<p>Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152122/button-aus-einem-thread-heraus-auf-enabled-setzen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 19:56:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152122.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Jul 2006 09:03:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 09:03:34 GMT]]></title><description><![CDATA[<p>Hallo allerseits!</p>
<p>Ich habe ein Problem bei folgendem:</p>
<p>Beim beenden eines Threads soll ein Button, der kurz vorm Starten des threads auf disabled gesetzt wurde, wieder enabled werden.</p>
<p>Ich habe schon verschiedenes probiert, aber ohne Erfolg:</p>
<pre><code class="language-cpp">UINT CiterundvisDlg::thrFunction(LPVOID pParam)
{
...
 while (*pFlag)  		
 {			
..
 }
...
GetDlgItem(IDC_BUTTON4)-&gt;EnableWindow(TRUE);
return 0;
}
</code></pre>
<p>was liefert:</p>
<blockquote>
<p>error C2352: 'CWnd::GetDlgItem' : illegal call of non-static member function<br />
C:\Programme\Microsoft Visual Studio 8\VC\atlmfc\include\afxwin.h(2074) : see declaration of 'CWnd::GetDlgItem'</p>
</blockquote>
<p>aber das GetGlgItem nicht statisch ist, daran kann ich ja nichts ändern, oder?</p>
<p>Auch habe ich probiert:</p>
<pre><code class="language-cpp">UINT CiterundvisDlg::thrFunction(LPVOID pParam)
{
...
 while (*pFlag)  		
 {			
..
 }
...
CiterundvisDlg::m_feldgrbutton.SetState( TRUE );
return 0;
}
</code></pre>
<p>wobei m_feldgrbutton eine Variable vom Typ CButton ist.<br />
Dort bekomme ich allerdings nur:</p>
<blockquote>
<p>error C2228: left of '.SetState' must have class/struct/union</p>
</blockquote>
<p>wobei ich nicht ganz verstehe, was der Unterschied zum m_Checkbutton Beispiel <a href="http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel17.htm" rel="nofollow">dort</a> ist.<br />
<em>(Und ich weiß: Das würde den Button sowieso nicht enablen, das war nur ein prinzipieller Versuch...)</em></p>
<p>Welche Möglichkeit bleibt also noch?<br />
Wa kann ich tun, um den Button vom Threadende aus in den enabled Zustand zu versetzen?</p>
<p>Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090555</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 03 Jul 2006 09:03:34 GMT</pubDate></item><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 09:53:51 GMT]]></title><description><![CDATA[<p>du könntest dem thread als startparameter z.b. die adresse des CButton objects mitgeben und dann: startparam-&gt;EnableWindow(TRUE)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090582</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Mon, 03 Jul 2006 09:53:51 GMT</pubDate></item><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 10:30:45 GMT]]></title><description><![CDATA[<p>Danke für den Tipp, ich probiere mal.. <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>
<p>(Das Problem, was hier stand, hat sich erledigt....)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090596</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 03 Jul 2006 10:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 10:51:18 GMT]]></title><description><![CDATA[<p>net schrieb:</p>
<blockquote>
<p>du könntest dem thread als startparameter z.b. die adresse des CButton objects mitgeben und dann: startparam-&gt;EnableWindow(TRUE)</p>
</blockquote>
<p>Funktioniert leider 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="😞"
    /><br />
In der den Thread aufrufenden Funktion steht:</p>
<pre><code class="language-cpp">CButton* feldgrbutton;
feldgrbutton = (CButton*) GetDlgItem(IDC_BUTTON4);
...
CWinThread* pThread = AfxBeginThread (thrFunction, &amp;feldgrbutton);
</code></pre>
<p>Im Thread stehht:</p>
<pre><code class="language-cpp">UINT CiterundvisDlg::thrFunction(LPVOID pParam)
{
...
CButton* feldbutton = (CButton*) pParam;
...
 while (*threadschalter)
 {			

 }
feldbutton-&gt;EnableWindow(TRUE);
return 0;
}
</code></pre>
<p>und das läßt sich auch kompilieren, beim ausführen gibt es beim Verlassen des Threads aber ein Problem:</p>
<blockquote>
<p>Unhandled exception at 0x0040c39c in programmname.exe: 0xC0000005: Access violation reading location 0xfffbe591.</p>
</blockquote>
<p>und im Debug Fenster wird auf winocc.cpp gezeigt, und zwar auf diese Stelle:</p>
<pre><code class="language-cpp">BOOL CWnd::EnableWindow(BOOL bEnable)
{
	ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));

	if (m_pCtrlSite == NULL)
		return ::EnableWindow(m_hWnd, bEnable);
	else
		return m_pCtrlSite-&gt;EnableWindow(bEnable); //hierhin zeigt der Pfeil
}
</code></pre>
<p>hab ich was falsch gemacht oder geht das prinzipiell nicht so?</p>
<p>Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090612</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 03 Jul 2006 10:51:18 GMT</pubDate></item><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 11:37:18 GMT]]></title><description><![CDATA[<p>Also ich würde es so machen:</p>
<pre><code class="language-cpp">CButton* feldgrbutton;
feldgrbutton = static_cast&lt;CButton*&gt;(GetDlgItem(IDC_BUTTON4));
...
CWinThread* pThread = AfxBeginThread (thrFunction, static_cast&lt;LPVOID&gt;(feldgrbutton)); //&amp; entfernt
</code></pre>
<p>dann im Thread:</p>
<pre><code class="language-cpp">UINT CiterundvisDlg::thrFunction(LPVOID pParam)
{
...
   CButton* feldbutton = static_cast&lt;CButton*&gt;(pParam);
...
 while (*threadschalter)
 {           

 }
   if(feldbutton != NULL &amp;&amp; ::IsWindow(feldbutton-&gt;GetSafeHwnd())) //extra prüfung ob Button überhaupt gültig ist
      feldbutton-&gt;EnableWindow(TRUE);
return 0;
}
</code></pre>
<p>Edit: Ich weis jetzt nicht ob man static_cast oder reinterpret_cast benutzen sollte (habs nicht getestet).</p>
<p>EDIT2: static_cast reicht aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090634</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Mon, 03 Jul 2006 11:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 11:47:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29">@Chris</a>++:</p>
<p>Danke, so funktioniert es! <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>(Jetzt muss ich nur noch verstehen warum....;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090645</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 03 Jul 2006 11:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 12:09:15 GMT]]></title><description><![CDATA[<p>dong schrieb:</p>
<blockquote>
<pre><code class="language-cpp">CButton* feldgrbutton;
feldgrbutton = (CButton*) GetDlgItem(IDC_BUTTON4);
...
CWinThread* pThread = AfxBeginThread (thrFunction, &amp;feldgrbutton);  //&lt;--
</code></pre>
</blockquote>
<p>Ich denke mal das es an dieser Zeile liegt. Du wandelst hier das Steuerelement in ein CButton* um (soweit richtig). Dann übergibst du der Funktion AfxBeginThread aber die &quot;Adresse des Zeigers&quot; der auf CButton zeigt (siehe &amp; Operator). Das wird der Knackpunkt sein. Denn die Fkt. erwartet als Parameter ein LPVOID (sprich: long pointer auf void -&gt; void*). Du kannst also an dieser stelle ruhig den Zeiger direkt übergeben (wenn er nach void gecastet ist).</p>
<pre><code class="language-cpp">CWinThread* pThread = AfxBeginThread (thrFunction, static_cast&lt;LPVOID&gt;(feldgrbutton));
//oder
CWinThread* pThread = AfxBeginThread (thrFunction, (LPVOID)feldgrbutton);
</code></pre>
<p>static_cast habe ich benutzt weil man die &quot;alten&quot; C-Cast's, z.B. (CButton*), nicht mehr benutzen sollte. Bei static_cast bekommt man z.B. mehr und genauere Fehlermeldungen falls man versucht zwischen falschen typen hin und her zu casten. Schau dir hier am besten mal static_cast, dynamic_cast und reinterpret_cast an.</p>
<p>Und dann ist ja noch die Sicherheitsabfrage:</p>
<pre><code class="language-cpp">if(feldbutton != NULL &amp;&amp; ::IsWindow(feldbutton-&gt;GetSafeHwnd())) //extra prüfung ob Button überhaupt gültig ist
      feldbutton-&gt;EnableWindow(TRUE);
</code></pre>
<p>Die Funktion ::IsWindow überprüft ob es sich auch wirklich um ein (gültiges) Fenster handelt. Wenn OnInitDialog vorher noch nicht aufgerufen wurde, dann wird FALSE zurück gegeben. Und mit feldbutton-&gt;GetSafeHwnd() bekommst du den Handle auf dieses Steuerelement. Hier kann ich dir aber nur sagen das ::IsWindow diesen Handle braucht. Mehr weis ich darüber leider auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090656</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Mon, 03 Jul 2006 12:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to Button aus einem Thread heraus auf enabled setzen on Mon, 03 Jul 2006 15:07:23 GMT]]></title><description><![CDATA[<p>Danke für die prima Erklärung! <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>
<p>Bisher habe ich mich erfolgreich darum gedrückt, aber solangsam werde ich mch doch mal mit dem &quot;casten&quot; auseinandersetzen müssen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090762</guid><dc:creator><![CDATA[dong]]></dc:creator><pubDate>Mon, 03 Jul 2006 15:07:23 GMT</pubDate></item></channel></rss>