<?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[Hilfe:Mit thread auf member-variable in Doc-klasse zugreifen-&amp;gt;Absturz]]></title><description><![CDATA[<p>Hallo,<br />
Ich schlage mich schon seit tagen mit einem problem rum und finde keine Lösung.</p>
<p>Ich greife imit einem thread auf ein CImage objekt zu und zeichne dieses gleichzeitig in einem dialogfenster und mein prog stürzt regelmäsig ab:</p>
<p>Ich habe in der Doc-klasse eine menbervariable</p>
<pre><code class="language-cpp">CImage m_bmp;
</code></pre>
<p>die ich im Konstruktor erzeuge</p>
<pre><code class="language-cpp">m_bmp.Create(800,800,24);
</code></pre>
<p>Dann hab ich einen Thread, in dessen funktion auf dieses image zugegriffen wird,<br />
z.B. so:</p>
<pre><code class="language-cpp">UINT __cdecl Cradar_02App::Thread708Func(LPVOID pParam){
	ThreadStruct* temp=(ThreadStruct* )pParam;
	Cradar_02Doc* pDoc=(Cradar_02Doc*)temp-&gt;pDoc;
	while(true){	
		pDoc-&gt;m_pbmp.SetPixel(100,100,RGB(222,222,222));
	}	
	return 0;	
}
</code></pre>
<p>Ausserdem zeichne ich das image in einem dialog:</p>
<pre><code class="language-cpp">void CPaintDlg::OnPaint(){
	Cradar_02Doc* pDoc =        dynamic_cast&lt;Cradar_02Doc*&gt;(((CMainFrame*)AfxGetMainWnd())-&gt;GetActiveDocument());
	ASSERT(pDoc);
	// Gerätekontext zum Zeichnen
    CPaintDC dc(this); 
    CPaintDC* pdc=&amp;dc;

    CRect rRect;
    GetClientRect(rRect);
    rRect.NormalizeRect();

    pDoc-&gt;m_pbmp.Draw(pdc-&gt;m_hDC, rRect);

    DeleteObject(&amp;pdc);
    DeleteObject(&amp;rRect);
}
</code></pre>
<p>Wenn jetzt der thread läuft und man das fenster schnell hin und her bewegt (sodass oft onpaint aufgerufen wird) stürzt das programm durch einen ASSERT in ReleaseDC() ab:</p>
<p>Der Debugger zeigt mir dann an:</p>
<pre><code class="language-cpp">inline void CImage::ReleaseDC() const throw()
{
	HBITMAP hBitmap;

	ATLASSUME( m_hDC != NULL );

	m_nDCRefCount--;
	if( m_nDCRefCount == 0 )
	{
		hBitmap = HBITMAP( ::SelectObject( m_hDC, m_hOldBitmap ) );
-&gt;		ATLASSERT( hBitmap == m_hBitmap );
		s_cache.ReleaseDC( m_hDC );
		m_hDC = NULL;
	}
}
</code></pre>
<p>hBitmap ist auf 0x00000000 ?!?</p>
<p>Vielleicht weiss ja jemand, was ich hier verbocke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191178/hilfe-mit-thread-auf-member-variable-in-doc-klasse-zugreifen-gt-absturz</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 09:24:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191178.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Aug 2007 03:53:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfe:Mit thread auf member-variable in Doc-klasse zugreifen-&amp;gt;Absturz on Fri, 31 Aug 2007 03:53:56 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich schlage mich schon seit tagen mit einem problem rum und finde keine Lösung.</p>
<p>Ich greife imit einem thread auf ein CImage objekt zu und zeichne dieses gleichzeitig in einem dialogfenster und mein prog stürzt regelmäsig ab:</p>
<p>Ich habe in der Doc-klasse eine menbervariable</p>
<pre><code class="language-cpp">CImage m_bmp;
</code></pre>
<p>die ich im Konstruktor erzeuge</p>
<pre><code class="language-cpp">m_bmp.Create(800,800,24);
</code></pre>
<p>Dann hab ich einen Thread, in dessen funktion auf dieses image zugegriffen wird,<br />
z.B. so:</p>
<pre><code class="language-cpp">UINT __cdecl Cradar_02App::Thread708Func(LPVOID pParam){
	ThreadStruct* temp=(ThreadStruct* )pParam;
	Cradar_02Doc* pDoc=(Cradar_02Doc*)temp-&gt;pDoc;
	while(true){	
		pDoc-&gt;m_pbmp.SetPixel(100,100,RGB(222,222,222));
	}	
	return 0;	
}
</code></pre>
<p>Ausserdem zeichne ich das image in einem dialog:</p>
<pre><code class="language-cpp">void CPaintDlg::OnPaint(){
	Cradar_02Doc* pDoc =        dynamic_cast&lt;Cradar_02Doc*&gt;(((CMainFrame*)AfxGetMainWnd())-&gt;GetActiveDocument());
	ASSERT(pDoc);
	// Gerätekontext zum Zeichnen
    CPaintDC dc(this); 
    CPaintDC* pdc=&amp;dc;

    CRect rRect;
    GetClientRect(rRect);
    rRect.NormalizeRect();

    pDoc-&gt;m_pbmp.Draw(pdc-&gt;m_hDC, rRect);

    DeleteObject(&amp;pdc);
    DeleteObject(&amp;rRect);
}
</code></pre>
<p>Wenn jetzt der thread läuft und man das fenster schnell hin und her bewegt (sodass oft onpaint aufgerufen wird) stürzt das programm durch einen ASSERT in ReleaseDC() ab:</p>
<p>Der Debugger zeigt mir dann an:</p>
<pre><code class="language-cpp">inline void CImage::ReleaseDC() const throw()
{
	HBITMAP hBitmap;

	ATLASSUME( m_hDC != NULL );

	m_nDCRefCount--;
	if( m_nDCRefCount == 0 )
	{
		hBitmap = HBITMAP( ::SelectObject( m_hDC, m_hOldBitmap ) );
-&gt;		ATLASSERT( hBitmap == m_hBitmap );
		s_cache.ReleaseDC( m_hDC );
		m_hDC = NULL;
	}
}
</code></pre>
<p>hBitmap ist auf 0x00000000 ?!?</p>
<p>Vielleicht weiss ja jemand, was ich hier verbocke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355782</guid><dc:creator><![CDATA[baz]]></dc:creator><pubDate>Fri, 31 Aug 2007 03:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe:Mit thread auf member-variable in Doc-klasse zugreifen-&amp;gt;Absturz on Fri, 31 Aug 2007 06:57:52 GMT]]></title><description><![CDATA[<p>CImage ist nicht threadsicher!<br />
Intern werden Referenz Zähler benutzt für einen temporären DC. Dazu wird aber m_nDCRefCount++; und kein InterlockedIncrement verwendet.</p>
<p>Es wundert nicht, dass dies aus zwei Threads heraus und einer multiporzessor Maschine zum Crash führt...</p>
<p>Verwende eine CrticalSection um die Nutzung auf einen Thread zu einer Zeit zu begrenzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355828</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 31 Aug 2007 06:57:52 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe:Mit thread auf member-variable in Doc-klasse zugreifen-&amp;gt;Absturz on Fri, 31 Aug 2007 18:55:50 GMT]]></title><description><![CDATA[<p>Danke,<br />
ich hab also eine klasse CImageThreadsicher von CImage abgeleitet und in dieser die methoden setpixel und draw überschrieben und arbeite dann nur noch mit dem CImagethreadsicher objekt.</p>
<pre><code class="language-cpp">[cpp]
class CImageThreadSicher :
	public CImage
{
public:
	CImageThreadSicher(void);
public:
	~CImageThreadSicher(void);

private:
	CCriticalSection m_CS;
public:
	void SetPixel(int x,int y,COLORREF color);
	void Draw(HDC hDestDC,const RECT&amp; rectDest);
};
</code></pre>
<pre><code class="language-cpp">void CImageThreadSicher::SetPixel(int x,int y,COLORREF color){
	m_CS.Lock();
	CImage::SetPixel(x,y,color);
	m_CS.Unlock();
}
</code></pre>
<p>Es scheint zu funktionieren <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/1356383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356383</guid><dc:creator><![CDATA[baz]]></dc:creator><pubDate>Fri, 31 Aug 2007 18:55:50 GMT</pubDate></item></channel></rss>