![]() |
Auf TPanel mit Thread malen
Hallo,
ich habe ein Problem mit der Synchronization von Threads. Ich habe einen P4 3GHz mit HT. Ich wollte nur so zum Zeitvertreib dieses ![]() Ich habe die Zeile // Sleep(30000); // replace with query.Open or such auskommentiert, da ich das Formular verschieben möchte usw. Wenn ich jetzt die Maus bewege beleibt die Animation stehen. Jetzt habe ich aus dem Code ein kleineres Beispiel abgeleitet. Das ist der Thread
Delphi-Quellcode:
Und hier der Aufruf
unit jsgaugethread_impl;
interface // [url]http://www.swissdelphicenter.ch/de/showcode.php?id=1906[/url] uses Windows, Classes, SysUtils, Controls, Graphics, ExtCtrls; type TJsGaugeThread = class(TThread) private { Private-Deklarationen } FPanel : TPanel; FPaintRect : TRect; FImage : TBitmap; procedure UpdateControl; protected procedure Execute; override; public constructor Create(Panel : TPanel; Paintrect: TRect); end; implementation Type TCanvasWinControl = class(TCustomControl) public property Canvas; end; constructor TJsGaugeThread.Create(Panel : TPanel; Paintrect: TRect); begin inherited Create(True); FPanel:= Panel; FPaintRect := Paintrect; FreeOnterminate := True; Resume; end; procedure TJsGaugeThread.Execute; var DC : HDC; T : Integer; begin FImage:=TBitmap.Create; T:=0; Try With FImage do begin Width:= FPaintRect.Right - FPaintRect.Left; Height:= FPaintRect.Bottom - FPaintRect.Top; end; { with } While Not Terminated do begin With FImage.Canvas do begin Brush.Color:=clRed; Brush.Style:=bsSolid; Rectangle(FPaintrect); Brush.Style:=bsClear; Font.Size:=12; Font.Style:=[fsBold]; Inc(T); TextOut(10,10,'Testtext aus dem Thread '+IntToStr(T)); Synchronize(UpdateControl); end; // With Image.Canvas do Sleep(50); end; // While Not Terminated do Finally FImage.FreeImage; end; end; procedure TJsGaugeThread.UpdateControl; begin With TCanvasWinControl(FPanel).Canvas do begin Lock; BitBlt(Handle, FPaintRect.Left, FPaintRect.Top, FPaintRect.Right, FPaintRect.Bottom, FImage.Canvas.Handle, 0, 0, SRCCOPY); UnLock; end; end; end.
Delphi-Quellcode:
Trotz der Verwendung von Synchronize und Lock/UnLock wird auf Panel1 irgendwann nicht mehr gezeichnet. Der Thread läuft weiter!
procedure TForm1.Button1Click(Sender: TObject);
begin FGauge:=TJsGaugeThread.Create(Panel1,Panel1.ClientRect); Application.ProcessMessages; end; procedure TForm1.Button2Click(Sender: TObject); begin FGauge.Terminate; end; Warum ist das so? |
Re: Auf TPanel mit Thread malen
Zitat:
|
Re: Auf TPanel mit Thread malen
Hallo,
Zitat:
Ich habe es so verstanden: Hole mit GetProcessAffinityMask die z.Z. gültige BitMask. Verändere die BitMask wie gewünscht Setze mit SetProcessAffinityMask die neue BitMask. Leider konnte ich keine Liste mit den Werten und deren Bedeutung für die BitMask finden. Dann kann ich mir auch noch nicht erklären, wie sich die Funktion heilend auf mein Problem auswirken soll. Hättest Du evt. noch ein paar Hineise? |
Re: Auf TPanel mit Thread malen
*push*
|
Re: Auf TPanel mit Thread malen
Da ich kein Intel Prozessor mit HT habe, kann ich hier auch nichts ausprobieren. Aber versuche mal das hier:
Delphi-Quellcode:
Ansonsten schau mal in die Newsgroup comp.os.ms-windows.programmer.win32
SetProcessAffinityMask(GetCurrentProcess, 1);
Du bist auf jeden Fall nicht der einzige mit HT Nebeneffekten. |
Re: Auf TPanel mit Thread malen
Hallo Sprint,
ich habe meinen Code gerade auf einem PIII 1 GHz (Win2000 und kompiliert mit D5 Pro SP1) ausgefühgt. Es tritt der gleiche Fehler auf. D.h. es kann nicht am HT liegen. |
Re: Auf TPanel mit Thread malen
Zitat:
|
Re: Auf TPanel mit Thread malen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
hier kommt das Testprogramm. Nach klick auf Button1 die Maus über dem Formular bewegen. Irgendwann wird dann nicht mehr gezeichnet. |
Re: Auf TPanel mit Thread malen
Wenn ich das Lock und Unlock entferne, dann geht's.
Edit: Das war jetzt auf dein erstes Posting bezogen. Die ZIP Datei habe ich mir nicht angeschaut. |
Re: Auf TPanel mit Thread malen
Zitat:
|
Re: Auf TPanel mit Thread malen
Hallo,
(*push*) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 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