Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi HideCaret in einem Thread? (https://www.delphipraxis.net/86215-hidecaret-einem-thread.html)

1234588 11. Feb 2007 01:04


HideCaret in einem Thread?
 
folgendes, ich möchte gerne meine ersten threading versuche machen und bin teilweise daran gescheitert ._.

mein thread:
Code:
Unit caretthread;

interface

uses
  classes,
  windows;

type
  Tcaretthread = Class(TThread)
    private
      frm: Cardinal;
    protected
       procedure execute; override;
    public
       constructor create; virtual;
       procedure sethandle(carethwnd: cardinal); virtual;
    end;

implementation

procedure Tcaretthread.execute;
var b: boolean;
begin
  b:=false;
  while b=false do hidecaret(frm);
end;

procedure Tcaretthread.sethandle(carethwnd: Cardinal);
begin
  frm := carethwnd;
end;

constructor Tcaretthread.create;
begin
  inherited create(true);
  freeOnTerminate := true;
end;

end.
und mein aufruf:
Code:
  caret := Tcaretthread.create;
  caret.sethandle(richedit1.handle);
  caret.resume;
ob es sinnvoll ist, ist mal dahingestellt :D
ist mein erster versuch mit threads und deshalb gehe ich auch davon aus das er sehr reich an fehlern ist
was ich nun nicht verstehe ist, wenn ich die zeile
while b=false do hidecaret(frm);
in
while b=false do beep(1000, 100);
abändere funktioniert das ganze

Luckie 11. Feb 2007 02:19

Re: HideCaret in einem Thread?
 
Triift das zu:
Zitat:

HideCaret hides the caret only if the specified window owns the caret.

1234588 11. Feb 2007 03:22

Re: HideCaret in einem Thread?
 
hm blöd aber ergibt eigentlich sinn
wäre ja schlimm wenn irgendwelche schadsoftware meinen geliebten caret verschwinden lässt :D

vielen dank

Christian Seehase 11. Feb 2007 13:33

Re: HideCaret in einem Thread?
 
Moin 1234588,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Was mir als erstes ins Auge sticht:

Delphi-Quellcode:
while b=false do
Sollte besser heissen:

Delphi-Quellcode:
while not b do
Der direkte Vergleich würde hier wohl funktionieren, aber zum einen ist die zweite Variante gemeinhin lesbarer, zum anderen kann man sich u.U. Probleme einhandeln, wenn man sich daran gewöhnt so zu vergleichen, da, i.d.R. false als 0, true aber als <> 0 verstanden wird.

Ich bin mir nicht ganz sicher, ob Deine Vorgehensweise garantiert sicher funktioniert.
Du greifst mit HideCaret auf eine VCL-Komponente (TRichEdit) zu. Dies sollte man aber nur über die Thread-Methode Synchronize tun, da die VCL-Komponenten nicht garantiert thread-safe sind.
Der Zugriff erfolgt zwar indirekt, über Handle, aber es könnte sein, dass das dennoch zu Problemen führt.
(wie gesagt: Sicher bin ich mir nicht).


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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