Watki i obrazki

0

Czesc,
mam taką sytuacja, że potrzebuje uzyskac efekt przypisania obrazka do Image po np. 5 sekundach.

Sleep zawiesza cala aplikacje, wiec postanowilem zrobic osobny watek, ktory bedzie mial w sobie sleepa.

i teraz IF wateksieskonczyl THEN przypiszObrazek

Czy moglby mi to ktos lopatologicznie wytlumaczyc na przykladzie, zebym sie nauczyl jak to robic?

Dziekuję.

0

Może inaczej zapytam. Czy poprawnie tworzę wątki itp?

unit MyThread;

interface

uses
  Classes, SysUtils, ExtCtrls, PNGImage;

type
  TMyThread = class(TThread)
  private
    FTime: Integer; // czas
    FImage: TImage;
    FPNGObject: TPNGObject;
  protected
    procedure Execute; override;
  public
    constructor Create(Time: Integer; Image: TImage; PNGObject: TPNGObject);
    procedure OnTerminate(Sender: TObject);
  end;

implementation

constructor TMyThread.Create(Time: Integer; Image: TImage; PNGObject: TPNGObject);
begin
  FTime := Time;
  FImage := Image;
  FPNGObject := PNGObject;
  
  inherited Create(False);
  FreeOnTerminate := True; // samozwalnianie
end;

procedure TMyThread.Execute;
begin
  Sleep(FTime);
  FImage.Picture.Assign(FPNGObject);
end;

procedure TMyThread.OnTerminate(Sender: TObject);
begin
  FreeAndNil(Self);
end;

end.
 
0

niepoprawnie. Jakiś tydzień temu (i chyba dalej trwa) była dyskusja o tym jak sprawdzać czy wątek się skończył. Poza tym tyla razy już było pisane o synchronizacji i jakbyś najpierw jakikolwiek kurs lub chociaż help do Delphi wcześniej przejrzał to byś wiedział, że tak nie wolno

0

Podałem swój kod, naprawdę się staram.
Dodam, że działam na D7.

Mogę prosić o konkrety?

0

nie prościej wziąć TTimer? Na prawdę nie masz pojęcia o podstawach a bierzesz się za zaawansowane rzeczy

0

Timerów musiałbym dać z 10...

Co jest złego wątku moim?

Chodzi o zwalnianie Terminate?

1
dydek3 napisał(a):

Timerów musiałbym dać z 10...
bo? Nie potrafisz na JEDNYM timerze sprawdzić upływu różnych czasów? A 10 nic nierobiących wątków to wg Ciebie jest OK?

dydek3 napisał(a):

Co jest złego wątku moim?

Chodzi o zwalnianie Terminate?

  1. odwołanie do VCLa z wątku bocznego - będzie błąd
  2. to FreeAndNil(Self); jest po prostu bez sensu
  3. gdzieś masz wywołanie OnTerminate
  4. jak jest FreeOnTerminate := True; to wątek zwolni się sam
    Jeszcze raz - wątki to nie jest coś prostego. A tutaj na pewno nie jest to poprawne rozwiązanie problemu
0

sytuacja taka mniej więcej: 10 image i do każdego osobno trzeba poprzypisywać obrazek, w różnym odstępie czasowym.

W moim kodzie zdefiniowałem OnTerminate, ale testowo, bo wcześniej i tak daje FreeOnTerminate := True , testowałem różnie.

VCL bez synchronize działa bardzo dobrze, ale dlatego pytam, czy może od strony kodu można lepiej to zrobić.

1
dydek3 napisał(a):

VCL bez synchronize działa bardzo dobrze
to tylko pogratulować...

0

Czary mary hoku pokus, a mógłbym prosić żebyś poprawił wedle uznania mój wątek?

1 użytkowników online, w tym zalogowanych: 0, gości: 1