AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Variable eines Record geht beim Multithreading verloren
Thema durchsuchen
Ansicht
Themen-Optionen

Variable eines Record geht beim Multithreading verloren

Ein Thema von j.zT · begonnen am 28. Nov 2024 · letzter Beitrag vom 28. Nov 2024
 
j.zT

Registriert seit: 12. Nov 2024
2 Beiträge
 
#1

Variable eines Record geht beim Multithreading verloren

  Alt 28. Nov 2024, 11:05
Delphi-Version: 12 Athens
Hallo,
ich versuche mich gerade am Multithreading mit delphi und bin gerade auf ein seltsames Verhalten gestoßen, dass ich nicht verstehe.
Ich habe derzeit folgenden Code:

Delphi-Quellcode:
procedure TForm1.btnEventClick(Sender: TObject);
begin
  TMessageManagerClass.DefaultManager.SubscribeToMessage(MyMessage,
  procedure(const Sender: TObject; const M: System.Messaging.TMessage)
  var
    bstr : string;
    p : string;
    i : string;
  begin
    bstr := (TThread.CurrentThread.ThreadID = MainThreadID).ToString();

    p := MyMessage(M).Value.Str;
    i := MyMessage(M).Value.I.ToString();

// TThread.Queue(nil, procedure
// begin
// edtEvent.Text := p + i + '/' + bstr + '/' + (TThread.CurrentThread.ThreadID = MainThreadID).ToString();
// end);

    TThread.Queue(nil, procedure
    begin
      edtEvent.Text := MyMessage(M).Value.Str + MyMessage(M).Value.I.ToString() + '/' + bstr + '/' + (TThread.CurrentThread.ThreadID = MainThreadID).ToString();
    end);
  end);

  EventThread.Create();
end;
Delphi-Quellcode:
  MyRecord = record
    Str: string;
    I: Integer;
  end;

  MyMessage = class(TMessage<MyRecord>)
  end;

  EventThread = class(TThread)
  protected
    procedure Execute; override;
  end;

Delphi-Quellcode:
procedure EventThread.Execute;
var
  rec : MyRecord;
begin
  while True do
  begin
    rec.str := Chr(ord('a') + Random(26));
    rec.I := Random(9);

    TMessageManager.DefaultManager.SendMessage(self, MyMessage.Create(rec));

    Sleep(1000);
  end;
end;
Ich sehe in der Variable p, dass ein zufälliger Buchstabe in dem string steht. Wenn der Code dann aber im TThread.Queue ankommt, dann ist MyMessage(M).Value.Str = ''.
Wenn ich in TThread.Queue aber auf die Variable p direkt zugreife (siehe auskommentierter Code), dann ist der Char wie erwartet im edit zu sehen.

Kann mir jemand erklären, warum das so passiert?

Edit 1:
Ich habe das ganze mit Synchronize getestet. Hier ist es egal, ob ich den String in einer Variablen zwischenspeichere, oder direkt aus dem Record auslese. In beiden Fällen wird der Char in den Edit geschrieben.

Geändert von j.zT (28. Nov 2024 um 11:26 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 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-2025 by Thomas Breitkreuz