<?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[in threads auf event warten und Datenbank Zugriff parallel]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>(Borland C++ Builder 5.0 / IBOS )</p>
<p>Ich möchte gerne auf einen Event warten und dann in einem Thread auf eine Datenbank zugreifen und Daten um kopieren.</p>
<p>D.h. Bis jetzt warte ich auf ein Event in der &quot;Hauptanwendung&quot; wenn ich es bekomme starte ich ein thread, der in eine Datenbank schaut und dann Dateien umkopiert, danach werden nochmal Einträge in die Datenbank gemacht.</p>
<p>Das funktioniert so lange ich kein zweites Event bekomme.</p>
<p>Wenn das geschieht, „verschluckt sich die Anwendung“ ich bin mir nicht sicher ob der Thread nicht richtig weiter läuft, es Konflikte mit den Komponenten gibt ? (mehrere Datenbank – zugriffe ??) .</p>
<p>Also</p>
<p>Erst wird nach dem Event(in der &quot;Hauptanwendung&quot;) ein thread gestartet:</p>
<pre><code class="language-cpp">if(AEventName == &quot;GO&quot;)
	{
		if(!db_BASIS-&gt;Connected)
			db_BASIS-&gt;Connected = true;

		Application-&gt;Restore();

		THR_BILDER = new thrBILDER(true);
		THR_BILDER-&gt;Priority = tpHigher;
		THR_BILDER-&gt;FreeOnTerminate = true;
		THR_BILDER-&gt;Resume();

		Application-&gt;Minimize();
	}
</code></pre>
<p>in dem Thread wird geschaut wieviele dateien von wo nach wo umkopiert werden :</p>
<pre><code class="language-cpp">asSQL = &quot;select id,pfad_von,pfad_nach from t_bild&quot;;

	try
	{
	 qry_Read3-&gt;SQL-&gt;Clear();
	 qry_Read3-&gt;SQL-&gt;Add(asSQL);
	 qry_Read3-&gt;Prepare();
	 qry_Read3-&gt;Open();
	 qry_Read3-&gt;First();

	 while(!qry_Read3-&gt;Eof)
	 {

         asPfad_Von =   qry_Read3-&gt;FieldByName(&quot;pfad_Von&quot;)-&gt;AsString;
         asPfad_Nach =   qry_Read3-&gt;FieldByName(&quot;pfad_Nach&quot;)-&gt;AsString;

         if(asPfad_Von != &quot;&quot;)
         {

            if(FileExists(asPfad_Von.c_str()))
            {
               asDirectory = ExtractFileDir(asPfad_Nach);
               if(ForceDirectories(asDirectory))
               {

                  if(!MoveFileEx(asPfad_Von.c_str(),asPfad_Nach.c_str(),MOVEFILE_REPLACE_EXISTING))
                  {
                     Protokol(&quot;File(nicht kopieren) &quot; + asPfad_Von + &quot; konnte nicht nach&quot; + asPfad_Nach + &quot; verschoben werden&quot;,asDATUMUHRZEIT);

                     if(!CopyFile(asPfad_Von.c_str(),asPfad_Nach.c_str(),false))
                     {
                       iStatus = 99;
                     }
                     else
                     {
                        DeleteFile(asPfad_Von.c_str());
                     }
                  }
               }
               else
               {
                  Protokol(&quot;Directory &quot; + asDirectory + &quot; konnte nicht erzeugt werden&quot;,asDATUMUHRZEIT);
                  iStatus = 99;
               }
            }
            else
            {
              Protokol(&quot;File &quot; + asPfad_Von + &quot; existiert nicht&quot;,asDATUMUHRZEIT);
               iStatus = 99;
            }

             if(iStatus == 99)
               iStatus_Auftrag = 999;

            asSQL = &quot;update t_bild set status = &quot; + IntToStr(iStatus);

            asSQL += &quot; where id = &quot;+ qry_Read3-&gt;FieldByName(&quot;id&quot;)-&gt;AsString;

            SetData(asSQL);

          }// if(asPfad_Von != &quot;&quot;)
          qry_Read3-&gt;Next();
      }
      qry_Read3-&gt;SQL-&gt;Clear();
      qry_Read3-&gt;Close();
      qry_Read3-&gt;Unprepare();

   }
   catch(...)
   {
      qry_Read3-&gt;SQL-&gt;Clear();
		qry_Read3-&gt;Close();
		qry_Read3-&gt;Unprepare();
   }
</code></pre>
<p>Das funktioniert auch wenn nur ein Thread läuft.</p>
<p>(wenn er hier in der while schleife ist und das Hauptprogramm bekommt ein Event und startet einene weiteren Thread, dann werden die weiteren Einträge nicht berücksichtigt, die Dateien werden nicht mehr umkopiert.)</p>
<p>Ich denke habe irgendwie das gefühl das der Thread aus der Schleife<br />
&quot;while(!qry_Read3-&gt;Eof)&quot;<br />
gerissen wird. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> &quot;</p>
<p>kann das sein ? kann das wo anders drann liegen ? Hat einer irgend eine Idee ???</p>
<p>Über hilfe würde ich mich sehr freuen <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>P.S. Der zweite Thread läuft dann sauber durch nur der erste nicht.</p>
<p>Danke</p>
<p>YLIREBUS</p>
<p>/Edit : String-Literal im Quellcode korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176594/in-threads-auf-event-warten-und-datenbank-zugriff-parallel</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 05:53:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176594.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Mar 2007 17:00:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to in threads auf event warten und Datenbank Zugriff parallel on Thu, 22 Mar 2007 18:20:27 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>(Borland C++ Builder 5.0 / IBOS )</p>
<p>Ich möchte gerne auf einen Event warten und dann in einem Thread auf eine Datenbank zugreifen und Daten um kopieren.</p>
<p>D.h. Bis jetzt warte ich auf ein Event in der &quot;Hauptanwendung&quot; wenn ich es bekomme starte ich ein thread, der in eine Datenbank schaut und dann Dateien umkopiert, danach werden nochmal Einträge in die Datenbank gemacht.</p>
<p>Das funktioniert so lange ich kein zweites Event bekomme.</p>
<p>Wenn das geschieht, „verschluckt sich die Anwendung“ ich bin mir nicht sicher ob der Thread nicht richtig weiter läuft, es Konflikte mit den Komponenten gibt ? (mehrere Datenbank – zugriffe ??) .</p>
<p>Also</p>
<p>Erst wird nach dem Event(in der &quot;Hauptanwendung&quot;) ein thread gestartet:</p>
<pre><code class="language-cpp">if(AEventName == &quot;GO&quot;)
	{
		if(!db_BASIS-&gt;Connected)
			db_BASIS-&gt;Connected = true;

		Application-&gt;Restore();

		THR_BILDER = new thrBILDER(true);
		THR_BILDER-&gt;Priority = tpHigher;
		THR_BILDER-&gt;FreeOnTerminate = true;
		THR_BILDER-&gt;Resume();

		Application-&gt;Minimize();
	}
</code></pre>
<p>in dem Thread wird geschaut wieviele dateien von wo nach wo umkopiert werden :</p>
<pre><code class="language-cpp">asSQL = &quot;select id,pfad_von,pfad_nach from t_bild&quot;;

	try
	{
	 qry_Read3-&gt;SQL-&gt;Clear();
	 qry_Read3-&gt;SQL-&gt;Add(asSQL);
	 qry_Read3-&gt;Prepare();
	 qry_Read3-&gt;Open();
	 qry_Read3-&gt;First();

	 while(!qry_Read3-&gt;Eof)
	 {

         asPfad_Von =   qry_Read3-&gt;FieldByName(&quot;pfad_Von&quot;)-&gt;AsString;
         asPfad_Nach =   qry_Read3-&gt;FieldByName(&quot;pfad_Nach&quot;)-&gt;AsString;

         if(asPfad_Von != &quot;&quot;)
         {

            if(FileExists(asPfad_Von.c_str()))
            {
               asDirectory = ExtractFileDir(asPfad_Nach);
               if(ForceDirectories(asDirectory))
               {

                  if(!MoveFileEx(asPfad_Von.c_str(),asPfad_Nach.c_str(),MOVEFILE_REPLACE_EXISTING))
                  {
                     Protokol(&quot;File(nicht kopieren) &quot; + asPfad_Von + &quot; konnte nicht nach&quot; + asPfad_Nach + &quot; verschoben werden&quot;,asDATUMUHRZEIT);

                     if(!CopyFile(asPfad_Von.c_str(),asPfad_Nach.c_str(),false))
                     {
                       iStatus = 99;
                     }
                     else
                     {
                        DeleteFile(asPfad_Von.c_str());
                     }
                  }
               }
               else
               {
                  Protokol(&quot;Directory &quot; + asDirectory + &quot; konnte nicht erzeugt werden&quot;,asDATUMUHRZEIT);
                  iStatus = 99;
               }
            }
            else
            {
              Protokol(&quot;File &quot; + asPfad_Von + &quot; existiert nicht&quot;,asDATUMUHRZEIT);
               iStatus = 99;
            }

             if(iStatus == 99)
               iStatus_Auftrag = 999;

            asSQL = &quot;update t_bild set status = &quot; + IntToStr(iStatus);

            asSQL += &quot; where id = &quot;+ qry_Read3-&gt;FieldByName(&quot;id&quot;)-&gt;AsString;

            SetData(asSQL);

          }// if(asPfad_Von != &quot;&quot;)
          qry_Read3-&gt;Next();
      }
      qry_Read3-&gt;SQL-&gt;Clear();
      qry_Read3-&gt;Close();
      qry_Read3-&gt;Unprepare();

   }
   catch(...)
   {
      qry_Read3-&gt;SQL-&gt;Clear();
		qry_Read3-&gt;Close();
		qry_Read3-&gt;Unprepare();
   }
</code></pre>
<p>Das funktioniert auch wenn nur ein Thread läuft.</p>
<p>(wenn er hier in der while schleife ist und das Hauptprogramm bekommt ein Event und startet einene weiteren Thread, dann werden die weiteren Einträge nicht berücksichtigt, die Dateien werden nicht mehr umkopiert.)</p>
<p>Ich denke habe irgendwie das gefühl das der Thread aus der Schleife<br />
&quot;while(!qry_Read3-&gt;Eof)&quot;<br />
gerissen wird. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> &quot;</p>
<p>kann das sein ? kann das wo anders drann liegen ? Hat einer irgend eine Idee ???</p>
<p>Über hilfe würde ich mich sehr freuen <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>P.S. Der zweite Thread läuft dann sauber durch nur der erste nicht.</p>
<p>Danke</p>
<p>YLIREBUS</p>
<p>/Edit : String-Literal im Quellcode korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250665</guid><dc:creator><![CDATA[YLIREBUS]]></dc:creator><pubDate>Thu, 22 Mar 2007 18:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to in threads auf event warten und Datenbank Zugriff parallel on Fri, 23 Mar 2007 18:09:02 GMT]]></title><description><![CDATA[<p>Hi, vielleicht so etwas (Pseudocode):</p>
<pre><code>if(event_nr_2)
{
    while(alter_thread_noch_aktiv)
        ;
    // ah, jetzt ist er zuende, also:
    neuen_thread_erstellen(event_nr_2);
}
</code></pre>
<p>Warte erstmal ab, bis der alte Thread fertig durchgelaufen ist und starte dann den neuen. Oder häufen sich dann auf Dauer zuviele Warteschleifen an?<br />
Gruß,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1251329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1251329</guid><dc:creator><![CDATA[Christian Sonder]]></dc:creator><pubDate>Fri, 23 Mar 2007 18:09:02 GMT</pubDate></item><item><title><![CDATA[Reply to in threads auf event warten und Datenbank Zugriff parallel on Fri, 23 Mar 2007 23:08:39 GMT]]></title><description><![CDATA[<p>Erstellst Du in jedem Thread eine neue Verbindung / Transaktion? Was für eine Isolationsstufe verwendest Du?</p>
<p>Grüße Joe_M.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1251452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1251452</guid><dc:creator><![CDATA[zufaulzumeinloggen]]></dc:creator><pubDate>Fri, 23 Mar 2007 23:08:39 GMT</pubDate></item><item><title><![CDATA[Reply to in threads auf event warten und Datenbank Zugriff parallel on Mon, 26 Mar 2007 07:32:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/618">@Christian</a> Sonder<br />
Die threads sollten schon parallel arbeiten nicht hintereinander ;-).</p>
<p>@zufaulzumeinloggen<br />
Ja, ich erstelle in jedem thread eine neue Verbindung / Transaktion.</p>
<p>--&gt; Was für eine Isolationsstufe verwendest Du?<br />
Hier weiss ich leider nicht wovon Du sprichst ;-(. (tut mir leid)</p>
<p>Meinst Du so etwas wie :</p>
<p>TCriticalSection ?</p>
<p>(Habe schon versucht mit &quot;CriticalSection&quot; zu arbeiten , bin mir nur nicht sicher an welcher Stelle sie wirklich nötig sind.)</p>
<p>Habe im Entwicklerhandbuch eine Stelle gefunden, die noch von den Interbase Komponenten spricht und diese ausdrücklich als &quot;Threadsicher&quot; beschreibt.<br />
(Ich gehe mal davon auß, das die IBO's das auch sind, die kamen ja erst später raus ;-))</p>
<p>Von daher habe ich bei allem was Datenbankzugriff angeht &quot;CriticalSection&quot; weg gelassen.</p>
<p>(Habe aber vorher auch schon den Test gemacht und um jeden Zugriff eine<br />
&quot;CriticalSection&quot; gebaut - ohne Erfolg ;-(.</p>
<p>Wenn Du was anderes meinst, bitte ich um Aufklärung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Danke Euch erstmal</p>
<p>Ylirebus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1252662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1252662</guid><dc:creator><![CDATA[YLIREBUS]]></dc:creator><pubDate>Mon, 26 Mar 2007 07:32:59 GMT</pubDate></item><item><title><![CDATA[Reply to in threads auf event warten und Datenbank Zugriff parallel on Mon, 26 Mar 2007 08:44:20 GMT]]></title><description><![CDATA[<p>Hallo, nein eine TCriticalSection benötigst Du hier nicht. Zumindest fällt mir keine Stelle auf.</p>
<p>Mit Isolationsstufe meine ich die Isolationsstufe der Transaktionen. Diese würde ich auf tiConsistency setzen (bei TIBO_Transaction::Isolation). Das ist die 'höchste Sicherheitsstufe', die Datensätze in einer gestarteten Transaktion werden gesperrt und andere Transaktionen können diese nicht modifizieren. Ich vermute, die Transaktionen kommen sich gegenseitig ins Gehege.</p>
<p>Und wie gesagt, Du benötigst für jeden Thread eine komplett neue Verbindung zur Datenbank. Du darfts kein gemeinsames TDataModule verwenden, es sei denn, Du erzeugst in jedem Thread eine neue Instanz.</p>
<p>Grüße Joe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1252713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1252713</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 26 Mar 2007 08:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to in threads auf event warten und Datenbank Zugriff parallel on Mon, 26 Mar 2007 12:58:22 GMT]]></title><description><![CDATA[<p>Danke Dir erst einmal für Deine Mühe Joe_M.</p>
<p>Ich habe Deinen Rat befolgt und die Isolation auf &quot;tiConsistency&quot;<br />
gesetzt.</p>
<p>Leider ist das Ergebnis unverändert ;-(.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Ich suche weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1252927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1252927</guid><dc:creator><![CDATA[YLIREBUS]]></dc:creator><pubDate>Mon, 26 Mar 2007 12:58:22 GMT</pubDate></item><item><title><![CDATA[Reply to in threads auf event warten und Datenbank Zugriff parallel on Mon, 26 Mar 2007 13:08:46 GMT]]></title><description><![CDATA[<p>Es geht aber wohl in die Richtung habe mal das mitgelieferte Errorprotokol aktiviert :</p>
<pre><code>26.03.2007 15:07:39 - ErrorMessage:	ISC Fehlernummer:335544345
26.03.2007 15:07:39 - ErrorMessage:
26.03.2007 15:07:39 - ErrorMessage:	ISC Fehlermeldung:
26.03.2007 15:07:39 - ErrorMessage:	lock conflict on no wait transaction
26.03.2007 15:07:39 - ErrorMessage:

STATEMENT:

TIB_Query: &quot;&lt;TApplication&gt;.dm.qry_Write.&quot;

26.03.2007 15:07:39 - ErrorCodes:	335544345
26.03.2007 15:07:39 - ErrorCodes:	0
26.03.2007 15:07:39 - SQLMessage:	SQL Fehlernummer:-901
26.03.2007 15:07:39 - SQLMessage:
26.03.2007 15:07:39 - SQLMessage:	SQL Fehlermeldung:
26.03.2007 15:07:39 - SQLMessage:	Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements
26.03.2007 15:07:39 - ErrorMessage:	ISC Fehlernummer:335544345
26.03.2007 15:07:39 - ErrorMessage:
26.03.2007 15:07:39 - ErrorMessage:	ISC Fehlermeldung:
26.03.2007 15:07:39 - ErrorMessage:	lock conflict on no wait transaction
26.03.2007 15:07:39 - ErrorMessage:
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1252948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1252948</guid><dc:creator><![CDATA[YLIREBUS]]></dc:creator><pubDate>Mon, 26 Mar 2007 13:08:46 GMT</pubDate></item></channel></rss>