<?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[TThread Problem (Zugriffsverletzung bei destroy)]]></title><description><![CDATA[<p>Ich möchte von meinen Programmen prüfen lassen ob es eine neue Version gibt.<br />
Wenn der Rechner jedoch keine Internetverbindung hat bzw. diese überlastet ist,<br />
dauert es sehr lange bis ich einen Timeout bekomme. Ich würde daher die Abfrage gerne<br />
in einem extra Thread laufen lassen um mein Programm nicht zu behindern.</p>
<p>Leider taucht hier mein übliches Thread Problem auf. Ich bekomm eine Zugriffsverletzung<br />
beim Beenden meines Programms, wenn ich das Programm sehr früh beende d.H. der Thread<br />
noch läuft. Ich denke es hängt mit dem delete HTTP zusammen.</p>
<p>Kann sich das bitte mal jemand anschauen?</p>
<pre><code class="language-cpp">#ifndef ClassCheckVersionH
#define ClassCheckVersionH

#define PROGVERSION 924

#include &lt;vcl.h&gt;
#include &lt;IdHTTP.hpp&gt;

#include &lt;winsock.h&gt;

class cCheckVersion
{
    private:
    public:
        TIdHTTP *HTTP;

        cCheckVersion();
        ~cCheckVersion();
        bool GetVersion(AnsiString sURL, int &amp;iVersion);
};

class cCheckVersionThread : public TThread
{
    private:
        CheckVersion *CheckVersion;
        void __fastcall CheckForNewVersion();

    protected:
        void __fastcall Execute();
    public:
        __fastcall cCheckVersionThread(bool CreateSuspended);
        __fastcall ~cCheckVersionThread();
};

//---------------------------------------------------------------------------
#endif
</code></pre>
<pre><code class="language-cpp">#pragma hdrstop

#include &quot;ClassCheckVersion.h&quot;

void __fastcall cCheckVersionThread::Execute()
{
    MsgWaitForMultipleObjects(1,NULL,1, 1000, QS_TIMER);
    Application-&gt;ProcessMessages();
    CheckForNewVersion();
}

void __fastcall cCheckVersionThread::CheckForNewVersion()
{
    int iVersion;
    if (CheckVersion-&gt;GetVersion(&quot;http://www.datei_mit_programm/version.php&quot;, iVersion)) {
        if (iVersion &gt; PROGVERSION) {
            MessageDlg(&quot;Es ist eine neue Version verfügbar!&quot;, mtInformation, TMsgDlgButtons() &lt;&lt; mbOK, 0);
        }
    }
}

__fastcall cCheckVersionThread::cCheckVersionThread(bool CreateSuspended): TThread(CreateSuspended)
{
    CheckVersion = new cCheckVersion();
}

__fastcall cCheckVersionThread::~cCheckVersionThread()
{
    this-&gt;Terminate();
    while (!this-&gt;Terminated) {
        MsgWaitForMultipleObjects(1,NULL,1, 50, QS_TIMER);
        Application-&gt;ProcessMessages();
    }

    delete CheckVersion;
}

cCheckVersion::cCheckVersion()
{
    HTTP = new TIdHTTP(NULL);
}

cCheckVersion::~cCheckVersion()
{
    delete HTTP;
}

bool cCheckVersion::GetVersion(AnsiString sURL, int &amp;iVersion)
{
    Application-&gt;ProcessMessages();

    bool bReturn;
    Application-&gt;ProcessMessages();
    try {
        AnsiString sStatus = HTTP-&gt;Get(sURL);
        sStatus = sStatus.Trim();
        Application-&gt;ProcessMessages();
        iVersion = sStatus.ToIntDef(0);
        bReturn = true;
    } catch(...) {
        bReturn = false;
    }

    return bReturn;
}

//---------------------------------------------------------------------------

#pragma package(smart_init)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/139208/tthread-problem-zugriffsverletzung-bei-destroy</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 22:29:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/139208.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 04 Mar 2006 14:32:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Sat, 04 Mar 2006 15:10:06 GMT]]></title><description><![CDATA[<p>Ich möchte von meinen Programmen prüfen lassen ob es eine neue Version gibt.<br />
Wenn der Rechner jedoch keine Internetverbindung hat bzw. diese überlastet ist,<br />
dauert es sehr lange bis ich einen Timeout bekomme. Ich würde daher die Abfrage gerne<br />
in einem extra Thread laufen lassen um mein Programm nicht zu behindern.</p>
<p>Leider taucht hier mein übliches Thread Problem auf. Ich bekomm eine Zugriffsverletzung<br />
beim Beenden meines Programms, wenn ich das Programm sehr früh beende d.H. der Thread<br />
noch läuft. Ich denke es hängt mit dem delete HTTP zusammen.</p>
<p>Kann sich das bitte mal jemand anschauen?</p>
<pre><code class="language-cpp">#ifndef ClassCheckVersionH
#define ClassCheckVersionH

#define PROGVERSION 924

#include &lt;vcl.h&gt;
#include &lt;IdHTTP.hpp&gt;

#include &lt;winsock.h&gt;

class cCheckVersion
{
    private:
    public:
        TIdHTTP *HTTP;

        cCheckVersion();
        ~cCheckVersion();
        bool GetVersion(AnsiString sURL, int &amp;iVersion);
};

class cCheckVersionThread : public TThread
{
    private:
        CheckVersion *CheckVersion;
        void __fastcall CheckForNewVersion();

    protected:
        void __fastcall Execute();
    public:
        __fastcall cCheckVersionThread(bool CreateSuspended);
        __fastcall ~cCheckVersionThread();
};

//---------------------------------------------------------------------------
#endif
</code></pre>
<pre><code class="language-cpp">#pragma hdrstop

#include &quot;ClassCheckVersion.h&quot;

void __fastcall cCheckVersionThread::Execute()
{
    MsgWaitForMultipleObjects(1,NULL,1, 1000, QS_TIMER);
    Application-&gt;ProcessMessages();
    CheckForNewVersion();
}

void __fastcall cCheckVersionThread::CheckForNewVersion()
{
    int iVersion;
    if (CheckVersion-&gt;GetVersion(&quot;http://www.datei_mit_programm/version.php&quot;, iVersion)) {
        if (iVersion &gt; PROGVERSION) {
            MessageDlg(&quot;Es ist eine neue Version verfügbar!&quot;, mtInformation, TMsgDlgButtons() &lt;&lt; mbOK, 0);
        }
    }
}

__fastcall cCheckVersionThread::cCheckVersionThread(bool CreateSuspended): TThread(CreateSuspended)
{
    CheckVersion = new cCheckVersion();
}

__fastcall cCheckVersionThread::~cCheckVersionThread()
{
    this-&gt;Terminate();
    while (!this-&gt;Terminated) {
        MsgWaitForMultipleObjects(1,NULL,1, 50, QS_TIMER);
        Application-&gt;ProcessMessages();
    }

    delete CheckVersion;
}

cCheckVersion::cCheckVersion()
{
    HTTP = new TIdHTTP(NULL);
}

cCheckVersion::~cCheckVersion()
{
    delete HTTP;
}

bool cCheckVersion::GetVersion(AnsiString sURL, int &amp;iVersion)
{
    Application-&gt;ProcessMessages();

    bool bReturn;
    Application-&gt;ProcessMessages();
    try {
        AnsiString sStatus = HTTP-&gt;Get(sURL);
        sStatus = sStatus.Trim();
        Application-&gt;ProcessMessages();
        iVersion = sStatus.ToIntDef(0);
        bReturn = true;
    } catch(...) {
        bReturn = false;
    }

    return bReturn;
}

//---------------------------------------------------------------------------

#pragma package(smart_init)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1008505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1008505</guid><dc:creator><![CDATA[Acidmrp]]></dc:creator><pubDate>Sat, 04 Mar 2006 15:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 06:29:16 GMT]]></title><description><![CDATA[<p>hat keiner eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009381</guid><dc:creator><![CDATA[Acidmrp]]></dc:creator><pubDate>Mon, 06 Mar 2006 06:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 07:48:09 GMT]]></title><description><![CDATA[<p>Du kannst VCL-Komponenten nicht einfach in die Luft (NULL) erstellen. Die brauchen Eltern... Ausserdem stellt sich mir die Frage: AUF WELCHER ZEILE ZUM HENKER ENTSTEHT DIE ZUGRIFFSVERLETZUNG?!?</p>
<p><a href="http://www.junix.ch/bcb/help/debug.html" rel="nofollow">Der Debugger</a> hilft bei der beantwortung dieser Frage.</p>
<p>Ausserdem frage ich mich was diese Zeile soll?</p>
<pre><code class="language-cpp">delete CheckVersion;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1009412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009412</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Mon, 06 Mar 2006 07:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 08:30:14 GMT]]></title><description><![CDATA[<p>Was kann man den bei einer VCL Komponente als Parent verwenden, wenn man sie dynamisch<br />
erstellen lassen will? Wenn ich diese dynamisch in der Form erstellen lasse dann<br />
nehm ich die Form das ist klar. Wenn ich die jedoch wie hier von einer Klasse erstellen<br />
lasse was nehm ich dann? Muss ich die Form dann durchreichen oder gibt es eine andere<br />
Möglichkeit? Ich hab das jetzt mal so geändert.</p>
<p>die Klasse cCheckVersionThread legt ja mit</p>
<pre><code class="language-cpp">CheckVersion = new cCheckVersion();
</code></pre>
<p>eine neue Instanz der Klasse cCheckVersion an. Ich dachte ich müsste diese mit</p>
<pre><code class="language-cpp">delete CheckVersion;
</code></pre>
<p>am Ende wieder löschen. Ist dem nicht so?</p>
<p>wo die Zugriffsverletzung kommt weiß ich leider nicht sonst hätte ich das dazu<br />
geschrieben. Es wird keine Zeile rot markiert.</p>
<p>Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000</p>
<p>wenn ich das</p>
<pre><code class="language-cpp">delete CheckVersion;
</code></pre>
<p>entferne kommt keine Zugriffsverletzung mehr, bleiben dann noch Reste meines Programms<br />
im Speicher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009441</guid><dc:creator><![CDATA[Acidmrp]]></dc:creator><pubDate>Mon, 06 Mar 2006 08:30:14 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 08:41:40 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>Was kann man den bei einer VCL Komponente als Parent verwenden, wenn man sie dynamisch<br />
erstellen lassen will? Wenn ich diese dynamisch in der Form erstellen lasse dann<br />
nehm ich die Form das ist klar. Wenn ich die jedoch wie hier von einer Klasse erstellen<br />
lasse was nehm ich dann? Muss ich die Form dann durchreichen oder gibt es eine andere<br />
Möglichkeit?</p>
</blockquote>
<p>Parent != Owner.<br />
Wenn du dir mal die Konstruktoren von VCL-Controls anschaust, haben die als Parameter Owner. Genauso einen brauchst du auch, diesen übergibst du einfach als Wert an den Konstruktor des abgeleiteten COntrols.</p>
<p>Tip : Benutze den Dialog <em>Komponente/Neue Komponente...</em>, um die das Basiscontrol auszusuchen, von dem du ableiten willst.<br />
Dann wird eine korrekte Klasse erstellt, die du nur noch ableiten brauchst.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009445</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 06 Mar 2006 08:41:40 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 08:53:10 GMT]]></title><description><![CDATA[<p>Vielen Dank! Ich hab das jetzt auf den Owner geändert.</p>
<p>Das mit dem delete ist mir aber immer noch nicht klar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009452</guid><dc:creator><![CDATA[Acidmrp]]></dc:creator><pubDate>Mon, 06 Mar 2006 08:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 09:46:10 GMT]]></title><description><![CDATA[<p>Acidmrp schrieb:</p>
<blockquote>
<p>entferne kommt keine Zugriffsverletzung mehr, bleiben dann noch Reste meines Programms<br />
im Speicher?</p>
</blockquote>
<p>Klar bleibt das... Aber eine KLasse kann sich ja nicht selber löschen (o; Bzw. das kann sie schon... nur eine kleine Frage an dich: Wann wird der Destruktor einer KLasse aufgerufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009499</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Mon, 06 Mar 2006 09:46:10 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 10:33:35 GMT]]></title><description><![CDATA[<p>danke für die Antwort.</p>
<p>Ist klar das die Klasse sich nicht selber löschen kann. Das macht sie aber doch auch gar<br />
nicht.</p>
<p>Die Klasse cCheckVersionThread erstellt eine Instanz der Klasse cCheckVersion<br />
wenn dann der Thread gelöscht wird soll dieser im Destruktor natürlich auch noch die<br />
von ihm angelegte Instanz der Klasse cCheckVersion löschen.</p>
<p>Die Form1 erstellt von der Klasse cCheckVersionThread eine Instanz, diese wird dann<br />
in void __fastcall TForm1::FormDestroy(TObject *Sender) wieder gelöscht.</p>
<p>Das Kernproblem liegt hier:<br />
- die Hauptanwendung erzeugt und startet einen neuen Thread der eine zeitauwendige<br />
Operation durchführt<br />
- die Hauptanwendung wird beendet solange jedoch die Zeitaufwendige Operation vom<br />
Thread noch läuft<br />
- wenn nun der Thread gelöscht wird läuft er ja noch</p>
<p>d.h. muss ich solange warten bis die Zeitaufwendige Operation vom Thread beendet ist?<br />
Oder kann ich den Thread irgendwie zwingen sich selbst sofort zu beenden damit ich ihn<br />
ohne Gefahr lsöchen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009541</guid><dc:creator><![CDATA[Acidmrp]]></dc:creator><pubDate>Mon, 06 Mar 2006 10:33:35 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 10:36:12 GMT]]></title><description><![CDATA[<p>Acidmrp schrieb:</p>
<blockquote>
<p>d.h. muss ich solange warten bis die Zeitaufwendige Operation vom Thread beendet ist?</p>
</blockquote>
<p>Ja. Oder eine Abort-Funktion aufrufen die die zeitaufwändige OPeration vorzeitig beendet.</p>
<p>Acidmrp schrieb:</p>
<blockquote>
<p>Oder kann ich den Thread irgendwie zwingen sich selbst sofort zu beenden damit ich ihn ohne Gefahr lsöchen kann?</p>
</blockquote>
<p>kein guter Ansatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009550</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Mon, 06 Mar 2006 10:36:12 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 10:49:33 GMT]]></title><description><![CDATA[<p>kann man TIdHTTP irgendwie sagen, dass es abbrechen soll? Das Problem besteht<br />
hauptsächlich dann wenn die entsprechende Seite nicht erreichbar ist. Dann dauert es<br />
schon mal eine Minute bis Indy sich geschlagen gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009558</guid><dc:creator><![CDATA[Acidmrp]]></dc:creator><pubDate>Mon, 06 Mar 2006 10:49:33 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 12:18:59 GMT]]></title><description><![CDATA[<p>... was sagt denn die Indy-Doku dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1009616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009616</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Mon, 06 Mar 2006 12:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to TThread Problem (Zugriffsverletzung bei destroy) on Mon, 06 Mar 2006 17:40:33 GMT]]></title><description><![CDATA[<p>leider find ich nur bei Indy 9 einen Timeout zum Abbrechen find ich gar nichts <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1009941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1009941</guid><dc:creator><![CDATA[Acidmrp]]></dc:creator><pubDate>Mon, 06 Mar 2006 17:40:33 GMT</pubDate></item></channel></rss>