AGB  ·  Datenschutz  ·  Impressum  







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

VCL Multithread zB. TBitMap Zugriff

Ein Thema von bernhard_LA · begonnen am 1. Jul 2012 · letzter Beitrag vom 3. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

VCL Multithread zB. TBitMap Zugriff

  Alt 1. Jul 2012, 14:53
ich bin auf der Suche nach Bugs in unserer Anwendung, als Ursache vermute ich das Thema "VCL, .... " und ThreadSafe programmieren

( siehe zb. http://www.delphipraxis.net/130497-v...absichern.html)

Es geht um folgendes Fehlerbild : GUI Anzeigen kommen nicht immer, Leinwand erlaubt kein Zeichnen -Fehlermeldung, ... anstelle einer gezeichneten Bitmap erhalte ich nur eine weiße Fläche ....

Gibt es Code beipiele , wie ich Ausgaben in die VCL als Threadsafe ... durchführe ... ich suche kleine Code beipiele um ein Konzept für das Bug Fixing unserer Anwendung zu erstellen.

Geändert von TBx ( 1. Jul 2012 um 23:06 Uhr) Grund: Geschrei aus dem Titel entfernt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 15:56
Eigentlich isses Einfach:

- alle Zugriffe auf nicht threadsichere VCL-Dinge über Synchronize erledigen

- Dinge, wo nur deine Codes drauf zugreifen (z.B. eine TList oder andere Variablen, Speicherblöcke, Dateien, Handles) über CriticalSection und Co. (wobei hier natürlich auch Synchronize ginge)




Synchronize sichert ab, da alle Zugriffe nur im Haptthread erfolgen und dadurch immer nur Einer gleichzeitig arbeiten kann.

CriticalSection sperrt Zugriffe für andere Threads, wärend ein Thread damit arbeitet.

ReadWriteSynchronizer erlauben gleichzeitige Lesezugriffe aber beim Ändern wird alles andere gesperrt.





Du kannst ein Bitmap gerne innerhalb eines Threads bearbeiten, aber die Übergabe, also Anzeigen, bzw. dea Kopieren des Inhalts davon, rüber zu VCL muß abgesichert werden.


Codebeispiele?
Für CriticalSections und Synchronize findet man jede Menge, wobei hier die auch schon OH genaug erklärt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Jul 2012 um 16:01 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 16:56
unter http://www.drbob42.com/uk-bug/hood-04.htm wird im Beispiel die nicht Thread sicheren VCL Object im Thread create übergeben, ist dies die beste Lösung zu diesem Thema ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 17:13
ist dies die beste Lösung zu diesem Thema ?
Es kommt drauf an, was genau du machen willst.

Das Create wird noch im Hauptthread verarbeitet, daher kann man dort alles machen, was auch ohne Thread möglich ist.

Wenn die übergebenen Objekte nirgenwo in der VCL benutzt werden, also wenn die VCL, bzw. der Hauptthread oder ein anderer Thread nicht darauf zugreifen, dann kann man danach im Thread diese Objekte problemlos nutzen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 19:11
Also bei TBitmap bzw. TCanvas im speziellen reicht es nach meiner Erfahrung, (Bitmap.)Canvas.Lock/Unlock aufzurufen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 20:10
Hmm, von der Absicherung her sollte das dann wohl der CriticalSection Sperrung entsprechen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 20:56
könnte ich mir durch diesen Ansatz eine ThreadSafe VCL Zusammenbasteln,
ich müsste halt die wichtigsten Funktionen innerhalb von .Create (....) oder .... bereitstellen; Mir gehts um das Konzept - möglichst flexibel - gut lesbar - einfach - Stabil .....


Delphi-Quellcode:

  THreadSafeMemo = class(TThread);


     Fmemo : Tmemo;

      constructor Create(amemo : TMemo)

      procedure AddText (aString : String);

      .....
  end;


 ThreadSafeMemo.constructor Create(amemo : TMemo)
 begin
       Fmemo := Tmemo;
.....
end;

Geändert von bernhard_LA ( 1. Jul 2012 um 21:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 22:24
Das Create wird noch im Hauptthread verarbeitet, daher kann man dort alles machen, was auch ohne Thread möglich ist.

Wenn die übergebenen Objekte nirgenwo in der VCL benutzt werden, also wenn die VCL, bzw. der Hauptthread oder ein anderer Thread nicht darauf zugreifen, dann kann man danach im Thread diese Objekte problemlos nutzen.
Nicht unbedingt. Das Hauptproblem von VCL-GUI-Controls ist ja das die Win32-Ressourcen Thead-Affine sind. D.h. ein (Fenster-)Handle darf nur im Thread verwendet werden indem er erzeugt wurde. D.h. will man ein (T)Bitmap im Thread verändern so muss es auch in diesem erzeugt werden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 22:47
Hmm, aber es ist doch möglich, selbst Fenster von fremden Anwendungen zu manipulieren (z.B. einen disableten Button zu enablen, SetWindowPos etc.)
Was Bitmaps angeht: Da habe ich gerade erst ein kleines Programm geschrieben, bei dem ein Thread auf ein Bitmap zeichnet, das im Constructor des Threads erzeugt wird (also somit noch im Hauptthread), und dieses regelmäßig auf das Canvas einer Form kopiert. Läuft absolut zuverlässig und stabil, solange für beide Canvasse jeweils Lock und Unlock aufgerufen wird.

Ich dachte das Problem bei der VCL wären eher globale Variablen, die intern zur Verwaltung dienen.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#10

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 2. Jul 2012, 08:55
Hmm, aber es ist doch möglich, selbst Fenster von fremden Anwendungen zu manipulieren (z.B. einen disableten Button zu enablen, SetWindowPos etc.)
Das macht man dann aber über Windowsnachrichten, die dann von dem für das Fenster zuständigen Thread abgearbeitet werden.

Ich dachte das Problem bei der VCL wären eher globale Variablen, die intern zur Verwaltung dienen.
Wenn das so einfach währe, hätte Borland damals sicher auch eine threadsichere VCL gebaut.

Dein Beispiel mit dem Memo kann so nur stabil funktionieren, wenn der Thread alle Zugriffe und Aktionen mit dem Memo im Synchronize ausführt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz