<?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[Thread endet nich bzw. läuft nich richtig]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab ein Problem mit meinem Thread, er beendet nämlich nicht, bzw. läuf nicht richtig. Der Thread soll in einer DB suchen, ob der Dateiname schon drin steht. Solange er läuft is das flag m_ValThreadRuns true, aber das sieht man ja alles im Code. Ist da irgendwo ein Fehler? Ich verstehs nämlich nicht...</p>
<pre><code class="language-cpp">// Aufruf:
CheckForAlreadyAnalyzed();
Sleep(20);
while(m_ValThreadRuns)
	Sleep(100);
// an die Stelle kommt er nie 

bool cWndMain::CheckForAlreadyAnalyzed()
{
    DWORD ID;
    CreateThread(NULL, 0, ::CheckProc, NULL, 0, &amp;ID);
    return true;
}

DWORD WINAPI CheckProc(LPVOID Param)
{
    g_App-&gt;GetMainWnd()-&gt;CheckProc();
    return 0;
}

void cWndMain::CheckProc()
{
	m_ValThreadRuns = true;
	m_ValThreadShouldEnd = false;
	m_PicAnalyzed = false;

	CRITICAL_SECTION cs;
	InitializeCriticalSection(&amp;cs);

	SetWindowText(m_hStatusBar, &quot;Durchsuche DB...&quot;);

    try
    {
        std::string conn = &quot;Driver={Microsoft Access Driver (*.mdb)};Dbq=&quot;;
        conn += g_App-&gt;GetDBFileName();
	    conn += &quot;;&quot;;

        size_t p = m_FileName.rfind(&quot;\\&quot;);
        std::string fn = m_FileName.substr(p+1);
        std::string pn = m_FileName.substr(0, p+1);

        dtl::DBConnection::GetDefaultConnection().Connect(conn.c_str());
        dtl::DBConnection::GetDefaultConnection().CommitAll();

        dtl::DBView&lt;sAssocDBSet&gt; view(&quot;AR_Bilder&quot;);
        dtl::DBView&lt;sAssocDBSet&gt;::select_iterator it = view.begin();

        for(; it != view.end(); it++)
        {
            const sAssocDBSet&amp; set = *it;
            //if(set.Dateiname == fn &amp;&amp; set.Pfad == pn)
            if(stricmp(set.Dateiname.c_str(), fn.c_str()) == 0 &amp;&amp;
                stricmp(set.Pfad.c_str(), pn.c_str()) == 0 &amp;&amp; 
				set.Tiername != &quot;&quot;)
            {
                EnterCriticalSection(&amp;cs);
                m_PicAnalyzed = true;
				char c[256];
		sprintf(c, &quot;Bild wurde schon analysiert als %s&quot;, set.Tiername.c_str());
                SetWindowText(m_hStatusBar, c);
                m_ValThreadRuns = false;
                LeaveCriticalSection(&amp;cs);
                DeleteCriticalSection(&amp;cs);
                return;
            }

            if(m_ValThreadShouldEnd)
            {
                EnterCriticalSection(&amp;cs);
                m_ValThreadRuns = false;
                LeaveCriticalSection(&amp;cs);
                DeleteCriticalSection(&amp;cs);
                return;
            }
        }

        //dtl::DBConnection::GetDefaultConnection().ReleaseConnection();
    }
    catch(dtl::RootException&amp; ex)
    {
        MessageBox(m_hWnd, ex.what(), &quot;DB-Fehler&quot;, MB_ICONERROR);
        m_PicAnalyzed = false;
    }

    SetWindowText(m_hStatusBar, &quot;Bild wurde noch nicht analysiert!&quot;);
    m_PicAnalyzed = false;
    m_ValThreadRuns = false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/143940/thread-endet-nich-bzw-läuft-nich-richtig</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 19:44:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/143940.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Apr 2006 05:32:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread endet nich bzw. läuft nich richtig on Thu, 13 Apr 2006 05:32:05 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab ein Problem mit meinem Thread, er beendet nämlich nicht, bzw. läuf nicht richtig. Der Thread soll in einer DB suchen, ob der Dateiname schon drin steht. Solange er läuft is das flag m_ValThreadRuns true, aber das sieht man ja alles im Code. Ist da irgendwo ein Fehler? Ich verstehs nämlich nicht...</p>
<pre><code class="language-cpp">// Aufruf:
CheckForAlreadyAnalyzed();
Sleep(20);
while(m_ValThreadRuns)
	Sleep(100);
// an die Stelle kommt er nie 

bool cWndMain::CheckForAlreadyAnalyzed()
{
    DWORD ID;
    CreateThread(NULL, 0, ::CheckProc, NULL, 0, &amp;ID);
    return true;
}

DWORD WINAPI CheckProc(LPVOID Param)
{
    g_App-&gt;GetMainWnd()-&gt;CheckProc();
    return 0;
}

void cWndMain::CheckProc()
{
	m_ValThreadRuns = true;
	m_ValThreadShouldEnd = false;
	m_PicAnalyzed = false;

	CRITICAL_SECTION cs;
	InitializeCriticalSection(&amp;cs);

	SetWindowText(m_hStatusBar, &quot;Durchsuche DB...&quot;);

    try
    {
        std::string conn = &quot;Driver={Microsoft Access Driver (*.mdb)};Dbq=&quot;;
        conn += g_App-&gt;GetDBFileName();
	    conn += &quot;;&quot;;

        size_t p = m_FileName.rfind(&quot;\\&quot;);
        std::string fn = m_FileName.substr(p+1);
        std::string pn = m_FileName.substr(0, p+1);

        dtl::DBConnection::GetDefaultConnection().Connect(conn.c_str());
        dtl::DBConnection::GetDefaultConnection().CommitAll();

        dtl::DBView&lt;sAssocDBSet&gt; view(&quot;AR_Bilder&quot;);
        dtl::DBView&lt;sAssocDBSet&gt;::select_iterator it = view.begin();

        for(; it != view.end(); it++)
        {
            const sAssocDBSet&amp; set = *it;
            //if(set.Dateiname == fn &amp;&amp; set.Pfad == pn)
            if(stricmp(set.Dateiname.c_str(), fn.c_str()) == 0 &amp;&amp;
                stricmp(set.Pfad.c_str(), pn.c_str()) == 0 &amp;&amp; 
				set.Tiername != &quot;&quot;)
            {
                EnterCriticalSection(&amp;cs);
                m_PicAnalyzed = true;
				char c[256];
		sprintf(c, &quot;Bild wurde schon analysiert als %s&quot;, set.Tiername.c_str());
                SetWindowText(m_hStatusBar, c);
                m_ValThreadRuns = false;
                LeaveCriticalSection(&amp;cs);
                DeleteCriticalSection(&amp;cs);
                return;
            }

            if(m_ValThreadShouldEnd)
            {
                EnterCriticalSection(&amp;cs);
                m_ValThreadRuns = false;
                LeaveCriticalSection(&amp;cs);
                DeleteCriticalSection(&amp;cs);
                return;
            }
        }

        //dtl::DBConnection::GetDefaultConnection().ReleaseConnection();
    }
    catch(dtl::RootException&amp; ex)
    {
        MessageBox(m_hWnd, ex.what(), &quot;DB-Fehler&quot;, MB_ICONERROR);
        m_PicAnalyzed = false;
    }

    SetWindowText(m_hStatusBar, &quot;Bild wurde noch nicht analysiert!&quot;);
    m_PicAnalyzed = false;
    m_ValThreadRuns = false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1036424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036424</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 13 Apr 2006 05:32:05 GMT</pubDate></item><item><title><![CDATA[Reply to Thread endet nich bzw. läuft nich richtig on Thu, 13 Apr 2006 06:38:21 GMT]]></title><description><![CDATA[<p>Bist du dir sicher, daß du mit dem richtigen Objekt arbeitest? (nicht daß das Hauptprogramm die Member eines anderen Objekts ausliest als der Thread verändert)</p>
<p>Edit: Warum verwendest du eigentlich diese while-Schleife? WaitForSingleObject() ist wesentlich eleganter und resourcenschonender als Busy Waitung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036449</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 13 Apr 2006 06:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to Thread endet nich bzw. läuft nich richtig on Thu, 13 Apr 2006 07:19:36 GMT]]></title><description><![CDATA[<p>ja, ich verwende das selbe Fenster-Objekt, es gibt ja n ur eins davon <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>WaitForSingleObject kann ich mir ja mal anschauen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1036467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036467</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 13 Apr 2006 07:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to Thread endet nich bzw. läuft nich richtig on Thu, 13 Apr 2006 08:42:48 GMT]]></title><description><![CDATA[<p>WaitForSingleObject ist besser als dein while. dein while produziert nur unnötiges busy waiting. mit WaitForSingleObject lässt der Kernel deinen hauptthread schlafen bis der das ereignis eintritt das ist 1000 mal besser. die handhabung ist in deinem fall sehr simpel einfach WaitForSingleObject( ThreadHandle, INFINITE ) oder wenn du einen timeout haben willst statt INFINITE den timeout wert den du maximal warten willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036534</guid><dc:creator><![CDATA[objecti]]></dc:creator><pubDate>Thu, 13 Apr 2006 08:42:48 GMT</pubDate></item></channel></rss>