Einzelnen Beitrag anzeigen

Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Zugriff zwischen zwei Threads

  Alt 16. Sep 2005, 21:34
Hi,

zulässig ist es, die Form ist auch weiter benutzbar, allerdings ist es so nicht dazu geeignet, um auf ein Control zuzugreifen.

Ein Zugriff auf ein Control muss immer aus dem Thread erfolgen, der das Control angelegt hat, also (so gut wie immer) aus dem Hauptthread der Anwendung. Das kannst du, wie Robert schon geschrieben hat, erreichen, in dem du die Methode die auf das Control zugreift über Invoke aufrufst.

Beispiel:
Code:
public class MyThread
{
   
  public delegate void UpdateDelegate(string s);
   
  public TextBox StatusTB;

  void Update(string s)
  {
    StatusTB.Text = s;
  }

  void Execute() // Thread-Routine
  {
    // ...
    StatusTB.Invoke(new UpdateDelegate(Update), new object[] {"foo"});
    // ...
  }

  // ...
}
Das Problem dabei ist, dass der Invoke-Aufruf so lange nicht zurückkehrt bis die übergebene Methode im Hauptthread ausgeführt worden ist und der Thread somit auch nicht weiterarbeiten kann. Sollte das stören, musst du die Daten in einen Zwischenpuffer schreiben (Array oder ähnliches) den Zugriff darauf synchronisieren (manche Collections gibt's schon als Thread-sichere Variante) und dir eine Möglichkeit überlegen, wie du dem Hauptthread mitteilst, dass neue Daten im Puffer sind.

Zu lock:
Das kannst du verwenden, wenn du auf Felder aus verschiedenen Threads heraus zugreifen willst, und verhindern möchtest, dass sie sich dabei in die Quere kommen.

Beispiel:
Code:
public class GemeinsameDaten
{
  private object dat;

  public object Datum
  {
    set
    {
      lock(this)
      {
        dat = value;
      }
    }
    get
    {
      object d;
      lock(this)
      {
        d = dat;
      }
      return d;
    }
}
Wenn jetzt einer der Threads zum Beispiel set Datum ausführt, wird bei Lock(this) geprüft, ob bereits ein anderer Thread ein lock auf das Objekt ausgeführt hat. Ist das der Fall, dann wartet der neue Thread, bis der andere Thread den kritischen Abschnitt verlassen hat und fährt erst dann fort.
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat