AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

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
466 Beiträge
 
Delphi XE5 Enterprise
 
#1

VCL Multithread zB. TBitMap Zugriff

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

( siehe zb. VCL Zugriffe in Multithread Anwendung absichern)

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 22:06 Uhr) Grund: Geschrei aus dem Titel entfernt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
26.405 Beiträge
 
Delphi XE3 Professional
 
#2

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 14: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2013

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

Registriert seit: 8. Jun 2009
Ort: Bayern
466 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 15: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
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
26.405 Beiträge
 
Delphi XE3 Professional
 
#4

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 16: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2013
  Mit Zitat antworten Zitat
Namenloser
Online

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.318 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 18: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
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
26.405 Beiträge
 
Delphi XE3 Professional
 
#6

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 19:10
Hmm, von der Absicherung her sollte das dann wohl der CriticalSection Sperrung entsprechen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2013
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
466 Beiträge
 
Delphi XE5 Enterprise
 
#7

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 19: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 20:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
Ort: Oberreichenbach
14.118 Beiträge
 
Delphi XE2 Professional
 
#8

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 21: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
Online

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.318 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 1. Jul 2012, 21: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
896 Beiträge
 
Delphi 2007 Professional
 
#10

AW: VCL MULTITHREAD zB. TBITMAP ZUGRIFF

  Alt 2. Jul 2012, 07: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   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf