AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Multithreading (Access Violation)

Ein Thema von exchange · begonnen am 18. Nov 2016 · letzter Beitrag vom 30. Nov 2016
Antwort Antwort
exchange

Registriert seit: 16. Feb 2009
Ort: Erftstadt
20 Beiträge
 
#1

Multithreading (Access Violation)

  Alt 18. Nov 2016, 16:48
Hallo,
ich bin gerade dabei meine erste Multithreading Anwendung am basteln.
Es sollen, aktuell, 2 Threads Datensätze aus einer DB holen und diese dann via http hochladen.

Ich hatte mich für die Komponente BMDThread entschieden. Wenn man mal die Datenbankverbindung außen vor lässt, funktioniert das ganze auch gut

Beide Threads werden gleichzeitig gestartet. Dabei erhalte ich entweder eine Access Violation, "Zu wenig Arbeitsspeicher" oder es funktioniert mal.

Wenn ich die Threads zeitversetzt starte, funktioniert es einwandfrei.

Im Execute Event der Threads habe ich die procedure drin stehen z.B. ExecuteAccept();

Hier die gesamte procedure:
Delphi-Quellcode:
procedure TForm_Main.ExecuteAccept();
var DBConnection: TUniConnection; DBQuery: TUniQuery;
begin
  DBConnection:=TUniConnection.Create(nil);
  DBConnection.Server:='localhost';
  DBConnection.Port:=3306;
  DBConnection.Username:='root_copy';
  DBConnection.Password:='password';
  DBConnection.ProviderName:='MySQL';

  try
    DBConnection.Connect;
  except
    on E : Exception do
    begin
      cxMemo_Accept.Lines.Add('DBVerbindung Fehler');
      cxMemo_Accept.Lines.Add('Exception message = '+E.Message);
    end;
  end;

  if DBConnection.Connected then
  begin
    try
      DBQuery:=TUniQuery.Create(nil);
      DBQuery.Connection:=DBConnection;
      DBQuery.SQL.Text:='SELECT * FROM TABELLE h LIMIT 100;';
      DBQuery.Active:=true;
      cxMemo_Accept.Lines.Add(inttostr(DBQuery.RecordCount));
      DBQuery.Active:=false;
      DBQuery.Free;
    except
    on E : Exception do
    begin
      cxMemo_Accept.Lines.Add('Query Fehler');
      cxMemo_Accept.Lines.Add('Exception message = '+E.Message);
    end;
    end;
    DBConnection.Close;
  end;

  DBConnection.Free;
end;
Ich verstehe nicht genau wo das Problem ist. Habe doch extra alles in den jeweiligen Thread gepackt. Die zweite Procudure ist exakt gleich (die SQL Abfrage ist anders).

Vielleicht kann sich das einer erklären und mir auf die Sprünge helfen. Alternativ wollte ich die SQL Verbindung auf das Main Form setzen aber davon wird in mehreren Beiträgen abgeraten.



Vielen Dank
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Multithreading (Access Violation)

  Alt 18. Nov 2016, 16:55
Aus einem Thread heraus solltest du schonmal nicht auf die GUI zugreifen. Des Weiteren brauchst du für jeden Thread eine eigene Connection. Sonst wird das wohl beim Ausführen deiner Statements Probleme geben.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
978 Beiträge
 
Delphi 6 Professional
 
#3

AW: Multithreading (Access Violation)

  Alt 18. Nov 2016, 18:41
Hmm..

und wenn die verwendeten Komponenten mit COM arbeiten, braucht jeder Thread im Execute:

Delphi-Quellcode:
  CoInitializeEX(nil,COINIT_APARTMENTTHREADED);
  try

    ... Datenbankaktionen

  finally
    CoUninitialize;
  end;
  Mit Zitat antworten Zitat
exchange

Registriert seit: 16. Feb 2009
Ort: Erftstadt
20 Beiträge
 
#4

AW: Multithreading (Access Violation)

  Alt 18. Nov 2016, 19:02
Hallo,
Danke für die Antworten. Ich habe zwei Thread Elemente auf dem Form liegen. Somit auch 2x execute. Vorher hatte ich den obigen Code innerhalb des executes 1:1.

Damit hatten auch beide Threads eine eigene Connnection. Der Fehler kommt beim Verbindungsaufbau im ersten try except Block.


MfG
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: Multithreading (Access Violation)

  Alt 20. Nov 2016, 22:27
Zeig doch mal Deinen gesamten Quelltext! So ist es doch nur ein Rätseln.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Multithreading (Access Violation)

  Alt 21. Nov 2016, 02:50
Hallo,
wo ist das Synchronize beim Zugriff das das Memo?
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz