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..10] of integer; Server: array[0..10] of string; end; var pp1: TF7Param1; |
Ü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(nil, 0, @ZeitsyncroThread7, R, 0, dword(F7Threadid.dwThreadId)));
function ZeitSyncroThread7(p: pointer): DWORD; stdcall; var .. pp1: PF7Param1;
begin pp1 := p; hier kam der Datenmüll an |
Moderiert von
AXMD: Delphi-Tags hinzugefügtModeriert von
Narses: 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
Luckie hat folgendes geschrieben : |
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"?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!