AGB  ·  Datenschutz  ·  Impressum  







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

Zwei Threads wollen etwas in die Queue stopfen

Ein Thema von TiGü · begonnen am 25. Sep 2015 · letzter Beitrag vom 28. Sep 2015
 
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#1

Zwei Threads wollen etwas in die Queue stopfen

  Alt 25. Sep 2015, 15:35
Hallo miteinander,

ich habe wieder ein merkwürdiges Problem und suche jemanden, der mir den Knoten im Kopf löst.
Ich habe mein Problem auf ein kleines Testprojekt reduzieren können (siehe Anhang). Es besteht aus einen Formular mit einen Start-Button und einen Memo.
Es ist mit DX erstellt, sollte sich aber so auch in jeder Version größer XE2 öffnen lassen?!

Problembeschreibung:
In einer DLL laufen zwei Threads, die Daten produzieren und per Callback an das Hauptprogramm übertragen.
Da die Callback im Kontext des Threads aufgerufen wird, verbietet sich hier natürlich der direkte Zugriff auf Member des VCL-Mainthreads.
Daher stopfe ich die übergebenden Daten per TThread.Queue in die Warteschlange.

Delphi-Quellcode:
procedure TDataConsumerFrm.Notify(const AData: Pointer; const ADataCount: Cardinal);
var
  LArray: TArray<Integer>;
begin
  FLock.Enter;
  try
    if Assigned(AData) and (ADataCount > 0) then
    begin
      LArray := Copy(TArray<Integer>(AData), 0, ADataCount);

      TThread.Queue(nil,
        procedure
        begin
          ShowData(LArray);
        end);
    end;
  finally
    FLock.Leave;
  end;
end;
Nach kurzer Laufzeit erhalte ich dann merkwürdige Zugriffsverletztungen, die ich mir so nicht erklären kann, da es ja eine zeitlang gut geht.
Code:
Project QueueTestProject.exe raised exception class $C0000005 with message 'access violation at 0x00000000: read of address 0x00000000'.
Project QueueTestProject.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'.
Callstacks:
Code:
System._IntfCopy(???,???)
:0040cfbd @IntfCopy + $9
QueueFrm.TDataConsumerFrm.Notify($2D828E8,4)
QueueDLL.{Data.Producer.Impl}TDataProducer<System.Integer>.SendNotify
...

System.TObject.Create
QueueDLL.{Data.Producer.Impl}TDataProducer<System.Integer>.SendNotify
QueueDLL.{Data.Producer.Impl}TDataProducer<System.Integer>.Produce
...

System.SysGetMem(???)
:00405571 SysGetMem + $3D
:0116d3b6 {Data.Producer.Impl}TDataProducer<System.Integer>.SendNotify + $86
...

:7502c42d KERNELBASE.RaiseException + 0x58
System._Dispose(???,???)
System.ErrorAt(92,$40B05C)
System.Error(reInvalidPtr)
System._Dispose(???,???)
:0040b05c @Dispose + $C
Vcl.Forms.TApplication.WndProc((0, 0, 0, 0, 0, 0, (), 0, 0, (), 0, 0, ()))
System.Classes.StdWndProc(14223452,0,0,0)
:758862fa ; C:\Windows\syswow64\USER32.dll
...
Irgendwie klappt irgendwann das umkopieren der empfangenden Daten in das lokale LArray nicht mehr. Fragmentiere ich den Speicher zu sehr?
Über jeden Denkanstoß wäre ich dankbar.
Angehängte Dateien
Dateityp: zip QueueTest_2015-09-25.zip (14,2 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
 


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 13:53 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