Prosty wątek zacina mi cały program.

0

Witam. Piszę, ponieważ mam problem z wątkiem / programem.
Otóż posiadam prosty wątek:

unit Unit12;


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, System.IOUtils, System.Threading,
  Dialogs, Tlhelp32, StdCtrls, PsAPI, Vcl.Samples.Spin, Vcl.ExtCtrls, Math, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9, Unit10, Unit11, Unit13, Unit14, Unit15,
  uPlayer, Vcl.Menus, MMSystem;

type
  TMSG = class(TThread)
  private
  protected
    procedure Execute; override;
  end;

  var
  Msg:TMSG;


implementation
Uses unit1;


procedure TMSG.Execute;

begin
  FreeOnTerminate := true;
  while not self.terminated do
begin
Form11.Listbox1.Items.Add(('Czas:  ') + (FormatDateTime('HH:MM:SS:Z',Time)));
sleep(20000);
end;
end;

Initialization
MSG := TMSG.Create(True);

end.

Oraz wykorzystujący go checkbox:

procedure TForm1.CheckBox17Click(Sender: TObject);
begin
if CheckBox17.Checked then
begin
MSG.Resume;
end
else
begin
MSG.Suspend;
end;
end;

Wszystko działa mi dobre w momencie gdy z mojego głównego programu uruchomię formę 11. Lecz niestety program się zawiesza i wyłącza w momencie gdy tej formy nie uruchomię i tego listboxa nie widać.
W momencie gdy robię w głównej formie timer i wpisuję kod: Form11.Listbox1.Items.Add(('Czas: ') + (FormatDateTime('HHSS:Z',Time))); to żadnego problemu nie ma. Nic się nie zacina, a formy z listboxem nie muszę uruchamiać.

Dlaczego zatem cały program mi się wiesza jeżeli robię to z wątku?

0

Jako że uruchamiasz wątek bardzo wcześnie, istnieje spora szansa na to, że Form11 = nil bądź w inny sposób formatka jeszcze nie została zainicjowana.

0

Co w takim wypadku mogę zrobić by to doprowadzić do porządku?

1

Pierwsze primo: nie powinieneś aktualizować GUI z poziomu wątku bez dodatkowej synchronizacji (informacje na ten temat zostawię Tobie do odnalezienia).

Drugie primo: mógłbyś np. czekać aż formatka zostanie zainicjowana / pokazana (być może nawet samo Form11 <> nil starczy).

0

Niestety Form11 <> nil nie starcza. Zależało by mi bardzo, żeby to zrobić bez zacinania się programu / uruchamiania tej formy11. Starałem się znaleźć rozwiązanie na własną rękę, jednak mi się nie powiodło i dlatego napisałem temat tutaj.

1

Poczytaj o sekcjach krytycznych i synchronizacji wątków Rozdział 8

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