Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Threads und lokale Variablen


mholup13 - Do 05.03.09 07:59
Titel: Threads und lokale Variablen
Hallo zusammen,

ich hoffe das kann jemand ausreichend beantworten in den verschiedenen Hilfen hab ich mal nichts gefunden ( was aber nichts heissen muss).
Nun ich hatte Problme bei der Übergabe mit lokalen Variabeln an den Thread in der Form das Sie mal im Thread richtig ankamen das zweite mal aber nur Mühl ankam. Ich habe dann die lokalen Variablen in globale umgewandelt und siehe da es ging.

Auszug aus dem Programm.

Globale Variablen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  PF7Param1 = ^TF7Param1;
  TF7Param1 = record
    Index: array[0..10of integer;
    Server: array[0..10of string;
  end;
var
  pp1: TF7Param1; // dieser Parameter war vorher in der Procedure Zeitkorrektur1Click definiert


Übergebende Routine:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TForm7.Zeitkorrektur1Click(Sender: TObject);
var
  indx: Integer;
  z: Integer;
  
  Result: DWORD;
  hThread:                  THandle;
  F7Threadid: TProcessInformation;
  R: Pointer;
begin

  for z := 0 to suiLView.Items.Count - 1 do
    begin
      if suiLView.Items[z].Checked then begin

        pp1.Server[z] := suilView.Items[z].Caption;
        pp1.Index[z] := suilView.Items[z].Index;

      end;
    end;

      R:= Addr(pp1);
      CloseHandle(CreateThread(nil0, @ZeitsyncroThread7, R, 0, dword(F7Threadid.dwThreadId)));

// Thread:
function ZeitSyncroThread7(p: pointer): DWORD; stdcall;
var
  ..
  pp1: PF7Param1;

begin
  pp1 := p;  hier kam der Datenmüll an


Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Do 05.03.2009 um 09:55


Delete - Do 05.03.09 11:10

Lokale Variablen verlieren ihre Gültigkeit, wenn die Routine verlassen wird. Da du einen Zeiger übergibst ist dann auch der Speicherbereich ungültig, weil die Prozedur verlassen wird, nach dem sie den Thread erstellt hat.

Und noch was. Man sollte besser BeginThread nehmen anstatt CreateThread.


mholup13 - Do 05.03.09 11:19

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Lokale Variablen verlieren ihre Gültigkeit, wenn die Routine verlassen wird. Da du einen Zeiger übergibst ist dann auch der Speicherbereich ungültig, weil die Prozedur verlassen wird, nach dem sie den Thread erstellt hat.

Und noch was. Man sollte besser BeginThread nehmen anstatt CreateThread.


Also erst einmal ein herzliches "Danke" für Deine Antwort. Damit ist es meine Vermutung bestätigt.
Hat "CreateThread" irgendwelche Nachteile gegenüber "BeginThread"?