AGB  ·  Datenschutz  ·  Impressum  







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

Thread läuft nicht parallel --

Ein Thema von sonny2007 · begonnen am 9. Jan 2014 · letzter Beitrag vom 11. Jan 2014
Antwort Antwort
Seite 1 von 2  1 2      
sonny2007

Registriert seit: 27. Aug 2009
39 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 10:53
Deshalb war der Gedanke für jeden Thread unterschiedliche Bitmaps zu verwenden. Das sie nicht Threadsave sind habe ich in der Hilfe gelesen.

Also Thread 1 bekommt screen1 und search1 und thread 2 bekommt screen2 und search2. Somit sollten sich die Canvas doch nicht ins Gehege kommen oder sehe ich das falsch ?

Grüße
s0n
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 11:11
Leider ist dem nicht so. Ich habe mal ein Microdemo angehängt bei dem ein paar Bitmaps parallel erzeugt `bemalt` und gespeichert werden (Pfad anpassen). Wenn man sich das Ergebnis ansieht wird klar dass Canvas nicht Threadsave ist. Über lock ließe sich das ganze verhindern, aber dann ist der Gewinn durch die Threads ebenfalls weg. Ich weiß ja nicht was genau der Vergleich machen soll, aber über Scanlines (wenn Dir das hilft) sollte es keine Probleme geben.
Angehängte Dateien
Dateityp: zip Demo_Thread_CanvasProblem.zip (3,2 KB, 12x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 11:27
TBitmap und Co. wären Threadsave, wenn sie "unabhängig" verwendet werden und nichts Globales nutzen.

Aber sie verwenden intern weitere Klasseninstanten und da werden vorallen für TFont, TBrush uvm. globale Instanzen verwendet (wenn man selber nichts eigenes angibt und die Werte auf "Standard" läßt)
und da dort überall auf die selben globalen Singletons zugegrifen wird muß es zwangsläufig schief gehn, jenachdem was man mit dem Bitmap macht.



Was man machen kann, das Bitmap für die VCL blocken, wenn es z.B. in einem TPicture steckt oder sonstwie angezeigt wird,
im Hauptthread sich den Anfang der Daten (ScanLine der letzen Zeile) besorgt und im thread nur "direkt" selber darin rummalt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Jan 2014 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 12:01
Wenn man das Bild nur aufteilt, dann kann es ja auch passieren das sich der gesuchte Bereich in keinem Bild mehr befindet.

Bild:
111111
222222
333333
444444
555555
666666

Aufteilen in 2 Bilder:
111111
222222
333333

444444
555555
666666

Suche nach dem Bereich:
33
44

Habe ich mir zumindest beim Lesen so überlegt...
  Mit Zitat antworten Zitat
sonny2007

Registriert seit: 27. Aug 2009
39 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 12:17
Wenn man das Bild nur aufteilt, dann kann es ja auch passieren das sich der gesuchte Bereich in keinem Bild mehr befindet.

Bild:
111111
222222
333333
444444
555555
666666

Aufteilen in 2 Bilder:
111111
222222
333333

444444
555555
666666

Suche nach dem Bereich:
33
44

Habe ich mir zumindest beim Lesen so überlegt...
jepp das ist korrekt ,deshalb ist es ratsam sagen bei 100x100 das bild nicht in 2st. 50x100 zu teilen sondern um das suchbild größer
also 2St. 55x100 der so. sodass definitiv die Suche erfolgreich ist

Aber recht hast du. Habe ich noch gar nicht dran gedacht ;(
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.778 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 12:26

jepp das ist korrekt ,deshalb ist es ratsam sagen bei 100x100 das bild nicht in 2st. 50x100 zu teilen sondern um das suchbild größer
also 2St. 55x100 der so. sodass definitiv die Suche erfolgreich ist

Aber recht hast du. Habe ich noch gar nicht dran gedacht ;(
.. auch das wird nit zu einer 100% Trefferquote führen.
Denn es kann immer noch sein, dass der gesuchte Bildauschnitt auf der Schnittkante der beiden Bilder sich befinden.

Meiner Meinung nach müssen bei einer zweiteilung des Bildes 3 Suchabschnitte durchgeführt werden.

1. 00..50 (erster Bildteil)
2. 51..99 (zweiter Bildteil)
3. 25..75 (Schnittmenge, abhänging von der Größe des gesuchten Bildauschnitts)

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#7

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 13:15
Wenn man das Bild nur aufteilt, dann kann es ja auch passieren das sich der gesuchte Bereich in keinem Bild mehr befindet.
So war das in meinen Beitrag mit den Streifen gedacht:

Beispiel: Gegeben Gesamtbild mit Höhe 120,
Ausschnitt mit Höhe 30,
3 Threads

Dann sucht Thread 1 in dem Streifen ab vertikaler Position 1 bis 30,
Thread 2 ab Position 31-60 und
Thread 3 ab Position 61-91
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: Thread läuft nicht parallel --

  Alt 9. Jan 2014, 23:34
Wenn man das Bild nur aufteilt, dann kann es ja auch passieren das sich der gesuchte Bereich in keinem Bild mehr befindet.
Diese sehr richtige und wichtige Aussage macht deinen aktuellen Ansatz eigentlich komplett zunichte. So sehr, dass ich nicht mehr versuchen würde krampfhaft die Geschwindigkeit eines Verfahrens zu verbessern, dass konzeptionell bereits nicht funktioniert. Entweder du suchst im gesamten Bild Pixel für Pixel (man könnte dabei z.B. gerade und ungerade Zeilen auf 2 Threads verteilen - dann bliebe der Lerneffekt "Umgang mit Threads" erhalten), oder man greift gleich zur Bei Google suchenAutokorrelation, die genau solche Probleme sehr gut löst.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
sonny2007

Registriert seit: 27. Aug 2009
39 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Thread läuft nicht parallel --

  Alt 10. Jan 2014, 07:52
Medium hast vollkommen recht 99.47 % der Rechenzeit gehen beim kopieren des Bildausschnittes auf die temp.canvas drauf.
Das lässt mich erstmal daran zweifeln ob die Threadverwendung überhaupt notwendig ist. Denn wieso die Auswirkung versuchen auszubügeln,
wenn man doch direkt die Ursache eliminieren kann.

Werde jetzt mal versuchen es ohne Canvas versuchen. Danach das Thread trotzdem versuchen hinzubekommen ^^

Grüße s0n
  Mit Zitat antworten Zitat
sonny2007

Registriert seit: 27. Aug 2009
39 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Thread läuft nicht parallel --

  Alt 10. Jan 2014, 09:49
So ...

erst Gehversuche. Gedanken ( straft mich nicht wenn er komplett falsch ist ) <--- noch nicht so erfahren

1.Schritt beide Bitmaps in Streams zu speichern.
2.Schritt Header Daten von beiden Bitmaps aus den Streams entfern um die reinen Bilddaten zu haben
3.Schritt in einem TempStream nur die erste Pixelreihe des Suchbildes kopieren um eine Vorsuche zu benutzen, da sonst zu lange rechnet ( getestet )
4.Schritt in einer forschleife: immer den Pixelreihenabschnitt mit dem aktuellen Pixelreihenabschnitt des Screens ( genauso lang wie Suchabschnitt ) vergleichen


anbei mal ein bißchen Code

Delphi-Quellcode:
    ScreenBMP.PixelFormat := SearchBMP.PixelFormat ;

    SearchBMP.SaveToStream(SearchStream);
    ScreenBMP.SaveToStream(ScreenStream);
    //showMessage('Größe des Suchbildes x :'+inttostr(SearchBMP.Width)+' Y :'+inttostr(SearchBMP.Height)+' MemorySize :'+inttoStr(SearchStream.Size));
    //showMessage('Größe des Screens x :'+inttostr(ScreenBMP.Width)+' Y :'+inttostr(ScreenBMP.Height)+' MemorySize :'+inttoStr(ScreenStream.Size));

    // Header vom Suchbild entfernen
    SearchStream.Position := 53; // Bitmap Header Size = 54, deshalb Position auf 53
    SearchStream.Seek(0, soFromBeginning);
    tempSearch.CopyFrom(SearchStream,SearchStream.Size-54);
    tempSearch.Position := 0;
    SearchStream.Clear;
    SearchStream.CopyFrom(tempSearch,tempSearch.Size);
    tempSearch.Clear;


    // Header vom Screen entfernen
    ScreenStream.Position := 53; // Bitmap Header Size = 54, deshalb Position auf 53
    ScreenStream.Seek(0, soFromBeginning);
    tempScreen.CopyFrom(ScreenStream,ScreenStream.Size-54);
    tempScreen.Position := 0;
    ScreenStream.Clear;
    ScreenStream.CopyFrom(tempScreen,tempScreen.Size);
    tempScreen.Clear;



    // erste Zeile vom Suchbild als Vorraster benutzen
    SearchStream.Position := 0;
    tempSearch.CopyFrom(SearchStream,SearchBMP.Width*3);

    startTime := GetTickCount;
    for I := 0 to ScreenStream.Size-SearchBMP.Width*3-1 do
        begin
          ScreenStream.Position := i; // 3 wegen 24Bit
          tempScreen.Clear;
          tempScreen.CopyFrom(ScreenStream,SearchBMP.Width*3);
          tempScreen.Position := 0;
          tempSearch.Position := 0;
          if CompareMem(tempScreen.Memory, tempSearch.Memory,SearchBMP.Width*3) then
              showmessage('gleich');
        end;

    showMessage('Durchlaufzeit: '+Floattostr((GettickCount-starttime)/1000)+' s');
Ist der Gedankengang so erstmal richtig. Funktioniert das überhaupt?

Grüße
s0n
  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 01: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