Prosty wątek zacina mi cały program.

Prosty wątek zacina mi cały program.
AB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 2 lata
  • Postów:20
0

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

Kopiuj
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:

Kopiuj
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('HH:MM:SS: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?

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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.


AB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 2 lata
  • Postów:20
0

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

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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).


edytowany 1x, ostatnio: Patryk27
AB
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 2 lata
  • Postów:20
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.

edytowany 2x, ostatnio: ArekBrowarek
hzmzp
  • Rejestracja:ponad 11 lat
  • Ostatnio:3 dni
  • Postów:625
1

Poczytaj o sekcjach krytycznych i synchronizacji wątków https://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_8

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.