Autor Beitrag
mholup13
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 05.03.09 07:59 
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:
ausblenden 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:
ausblenden volle Höhe 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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"?