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
Aviator

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

AW: Multithreading (Access Violation)

  Alt 18. Nov 2016, 15: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
984 Beiträge
 
Delphi 6 Professional
 
#2

AW: Multithreading (Access Violation)

  Alt 18. Nov 2016, 17: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
 
#3

AW: Multithreading (Access Violation)

  Alt 18. Nov 2016, 18: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
 
#4

AW: Multithreading (Access Violation)

  Alt 20. Nov 2016, 21: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.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Multithreading (Access Violation)

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

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

AW: Multithreading (Access Violation)

  Alt 21. Nov 2016, 08:09
Hallo,
danke für die Infos. Hat aber leider nichts gebracht. Der Fehler entsteht wenn ich die Verbindung aufbauen will.

Folgende Fehler erscheinen:
Zugriffsverletzung bei Adresse 008BC0B5 in Modul 'ServiceTool.exe'. Lesen von Adresse 0000000C
ODER
DBVerbindung Fehler
Exception message = Zu wenig Arbeitsspeicher

Ohne das ich Parameter ändere, sind die Fehler nur manchmal. Sobald ich hingehe und die Threads zeitversetzt starte (z.B. 500 ms) erhalte ich keine Fehler.

Anbei mal den gesamten Quellcode von dem Beispiel.

Delphi-Quellcode:
unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, BMDThread, cxGraphics, cxLookAndFeels,
  cxLookAndFeelPainters, Vcl.Menus, dxSkinsCore, dxSkinBlack, dxSkinBlue,
  dxSkinBlueprint, dxSkinCaramel, dxSkinCoffee, dxSkinDarkRoom, dxSkinDarkSide,
  dxSkinDevExpressDarkStyle, dxSkinDevExpressStyle, dxSkinFoggy,
  dxSkinGlassOceans, dxSkinHighContrast, dxSkiniMaginary, dxSkinLilian,
  dxSkinLiquidSky, dxSkinLondonLiquidSky, dxSkinMcSkin, dxSkinMetropolis,
  dxSkinMetropolisDark, dxSkinMoneyTwins, dxSkinOffice2007Black,
  dxSkinOffice2007Blue, dxSkinOffice2007Green, dxSkinOffice2007Pink,
  dxSkinOffice2007Silver, dxSkinOffice2010Black, dxSkinOffice2010Blue,
  dxSkinOffice2010Silver, dxSkinOffice2013DarkGray, dxSkinOffice2013LightGray,
  dxSkinOffice2013White, dxSkinOffice2016Colorful, dxSkinOffice2016Dark,
  dxSkinPumpkin, dxSkinSeven, dxSkinSevenClassic, dxSkinSharp, dxSkinSharpPlus,
  dxSkinSilver, dxSkinSpringTime, dxSkinStardust, dxSkinSummer2008,
  dxSkinTheAsphaltWorld, dxSkinsDefaultPainters, dxSkinValentine,
  dxSkinVisualStudio2013Blue, dxSkinVisualStudio2013Dark,
  dxSkinVisualStudio2013Light, dxSkinVS2010, dxSkinWhiteprint,
  dxSkinXmas2008Blue, Vcl.StdCtrls, cxButtons, Vcl.ExtCtrls, cxControls,
  cxContainer, cxEdit, cxTextEdit, cxMemo, cxLabel, Uni, MySQLUniProvider,
  IdBaseComponent, IdThreadComponent, Data.DB, DBAccess;

type
  TForm_Main = class(TForm)
    cxButton1: TcxButton;
    Timer_Export_Radius_Accept: TTimer;
    Timer_Export_Radius_Deny: TTimer;
    cxMemo_Accept: TcxMemo;
    cxLabel1: TcxLabel;
    cxMemo_Deny: TcxMemo;
    cxLabel2: TcxLabel;
    idThread_Export_Radius_Accept: TIdThreadComponent;
    idThread_Export_Radius_Deny: TIdThreadComponent;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer_Export_Radius_AcceptTimer(Sender: TObject);
    procedure Timer_Export_Radius_DenyTimer(Sender: TObject);
    procedure Thread_Export_Radius_DenyTerminate(Sender: TObject;
      Thread: TBMDExecuteThread; var Data: Pointer);
    procedure Thread_Export_Radius_AcceptStart(Sender: TObject;
      Thread: TBMDExecuteThread; var Data: Pointer);
    procedure Thread_Export_Radius_DenyStart(Sender: TObject;
      Thread: TBMDExecuteThread; var Data: Pointer);
    procedure cxButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure idThread_Export_Radius_DenyRun(Sender: TIdThreadComponent);
    procedure idThread_Export_Radius_AcceptRun(Sender: TIdThreadComponent);
    procedure idThread_Export_Radius_AcceptTerminate(
      Sender: TIdThreadComponent);
    procedure idThread_Export_Radius_DenyTerminate(Sender: TIdThreadComponent);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form_Main: TForm_Main;
  MySQL: TMySQLUniProvider;

implementation

{$R *.dfm}

procedure TForm_Main.idThread_Export_Radius_AcceptRun(
  Sender: TIdThreadComponent);
var DBConnection: TUniConnection; DBQuery: TUniQuery;
begin
  cxMemo_Accept.Lines.Add(FormatDateTime('dd.mm.yyyy, hh:nn:ss', now) + ', Thread gestartet');

  DBConnection:=TUniConnection.Create(nil);
  DBConnection.Server:='172.16.6.50';
  DBConnection.Port:=3306;
  DBConnection.Username:='root_copy';
  DBConnection.Password:='password';
  DBConnection.ProviderName:='MySQL';
  DBConnection.Database:='xxx';
  DBConnection.LoginPrompt:=false;
  DBConnection.Pooling:=true;

  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 hotspotstatistik 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;

  Sender.Stop;
end;

procedure TForm_Main.idThread_Export_Radius_AcceptTerminate(
  Sender: TIdThreadComponent);
begin
  cxMemo_Accept.Lines.Add(FormatDateTime('dd.mm.yyyy, hh:nn:ss', now) + ', Thread beendet');
  Timer_Export_Radius_Accept.Enabled:=true;
end;

procedure TForm_Main.Thread_Export_Radius_AcceptStart(Sender: TObject;
  Thread: TBMDExecuteThread; var Data: Pointer);
begin
  cxMemo_Accept.Lines.Add('Thread Start');
end;

procedure TForm_Main.Thread_Export_Radius_DenyStart(Sender: TObject;
  Thread: TBMDExecuteThread; var Data: Pointer);
begin
  cxMemo_Deny.Lines.Add('Thread Start');
end;

procedure TForm_Main.Thread_Export_Radius_DenyTerminate(Sender: TObject;
  Thread: TBMDExecuteThread; var Data: Pointer);
begin
  cxMemo_Deny.Lines.Add('Thread Ende');
  Timer_Export_Radius_Deny.Enabled:=true;
end;

procedure TForm_Main.Timer_Export_Radius_AcceptTimer(Sender: TObject);
begin
  Timer_Export_Radius_Accept.Enabled:=false;
  idThread_Export_Radius_Accept.Start();
end;

procedure TForm_Main.Timer_Export_Radius_DenyTimer(Sender: TObject);
begin
  Timer_Export_Radius_Deny.Enabled:=false;
  idThread_Export_Radius_Deny.Start();
end;

procedure TForm_Main.cxButton1Click(Sender: TObject);
begin
  cxButton1.Enabled:=false;
  Timer_Export_Radius_Accept.Enabled:=true;
  Timer_Export_Radius_Deny.Enabled:=true;
end;

procedure TForm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  idThread_Export_Radius_Accept.OnTerminate := NIL;
  idThread_Export_Radius_Accept.Stop();

  idThread_Export_Radius_Deny.OnTerminate := NIL;
  idThread_Export_Radius_Deny.Stop();

  MySQL.Free;
end;

procedure TForm_Main.FormCreate(Sender: TObject);
begin
  MySQL:=TMySQLUniProvider.Create(nil);
end;

procedure TForm_Main.idThread_Export_Radius_DenyRun(Sender: TIdThreadComponent);
var DBConnection: TUniConnection; DBQuery: TUniQuery;
begin
  cxMemo_Deny.Lines.Add(FormatDateTime('dd.mm.yyyy, hh:nn:ss', now) + ', Thread gestartet');
  DBConnection:=TUniConnection.Create(nil);
  DBConnection.Server:='172.16.6.50';
  DBConnection.Port:=3306;
  DBConnection.Username:='root_copy';
  DBConnection.Password:='password';
  DBConnection.Database:='xxx';
  DBConnection.ProviderName:='MySQL';
  DBConnection.LoginPrompt:=false;
  DBConnection.Pooling:=true;

  try
    DBConnection.Connect;
  except
    on E : Exception do
    begin
      cxMemo_Deny.Lines.Add('DBVerbindung Fehler');
      cxMemo_Deny.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 hotspotstatistik h LIMIT 100;';
      DBQuery.Active:=true;
      cxMemo_Deny.Lines.Add(inttostr(DBQuery.RecordCount));
      DBQuery.Active:=false;
      DBQuery.Free;
    except
    on E : Exception do
    begin
      cxMemo_Deny.Lines.Add('Query Fehler');
      cxMemo_Deny.Lines.Add('Exception message = '+E.Message);
    end;
    end;
    DBConnection.Close;
  end;

  DBConnection.Free;
  Sender.Stop;
end;

procedure TForm_Main.idThread_Export_Radius_DenyTerminate(
  Sender: TIdThreadComponent);
begin
  cxMemo_Deny.Lines.Add(FormatDateTime('dd.mm.yyyy, hh:nn:ss', now) + ', Thread beendet');
  Timer_Export_Radius_Deny.Enabled:=true;
end;

end.

MFG
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.961 Beiträge
 
Delphi 12 Athens
 
#7

AW: Multithreading (Access Violation)

  Alt 21. Nov 2016, 08:16
Wie schon zweimal geschrieben wurde:
Du greifst aus deinem Thread unsynchronisiert (sprich im Kontext des Threads) auf dein Memo zu. Das kann nicht funktionieren! Es wird so immer solche nicht richtig greifbaren Probleme geben wie du sie jetzt hast.

Du zerschießt dir so den Speicher und die Folgen sieht man an ganz anderer Stelle.

Du darfst immer nur im Kontext des Hauptthreads auf visuelle Komponenten zugreifen. Wenn du über Datei --> Neu ein Threadobjekt erstellst, steht das dort auch direkt als Warnung im Kommentar drin.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#8

AW: Multithreading (Access Violation)

  Alt 21. Nov 2016, 08:20
Schmeiß mal die Indys da raus. Das hat mit Multithreading nicht so viel zu tun, wie Du glaubst.
Welche Delphi-Version hast du? Evntuell wäre ein TParallel.For etwas für Dich. Falls Du ein älteres Delphi hast, dann geht es auch über das klassische Threading per Threadklasse deklarieren und im Code an der gewünschten Stelle ausführen.
DEtails hier: http://www.delphipraxis.net/9238-thr...it-delphi.html

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  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 21:40 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-2025 by Thomas Breitkreuz