AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CreateThread Parameterübergabe

Ein Thema von drewble · begonnen am 30. Mai 2015 · letzter Beitrag vom 30. Mai 2015
Antwort Antwort
drewble

Registriert seit: 30. Mai 2015
1 Beiträge
 
#1

CreateThread Parameterübergabe

  Alt 30. Mai 2015, 21:12
Hallo,

ich sage euch schonmal vorab, dass ich die sufu benutzt habe und leider zu meiner Frage keine passende Antwort fand.

Ich hoffe auch darauf eine Antwort anstelle eines Verweises zur Sufu zu bekommen dass zukünftige User nicht in eine Sufuverweis-endlosschleife geraten wie ich teilweise.


Ich möchte eine TStringList als Parameter zu meiner Threadroutine übergeben, bin allerdings mit Delphi nicht sonderlich gut vertraut bisher

Ich erkläre mal wie mein gedanklicher Ansatz ist:

Hier die Funktion des Threads, als übergabe eben den Pointer 'p'
Delphi-Quellcode:
function GetProxys(p: pointer): LongInt; stdcall;
var
  list : ^TStringList;
begin
  list := TStringList(p);
  list^.Text := proxylistende.idHTTP.Post(proxylistende.site, proxylistende.postparam);
end;
//Hier die Routine die den Thread startet.
Delphi-Quellcode:
procedure StartGrab(var strList: TStringList);
var
  tID : DWORD;
  tHWND : THandle;
begin
  initiateProxyStructs;
  tHWND:=CreateThread(nil, 0, TFNThreadStartRoutine(@GetProxys), @strList, 0, tID);
  if tHWND <> 0 then CloseHandle(tHWND);
end;
Nachdem ich dann beispielsweise die Stringlist "strlist" erzeugt habe rufe ich einfach so auf:

StartGrab(strlist);


Keine Sorge, ich werde mir zum Thema 'Threadsafe' noch einiges durchlesen, bis jetzt weiß ich nur dass ich auf dem Heap allocaten sollte da der ram nach beendigung der Funktion wieder free'd wird.

Ich verstehe nur meinen Fehler nicht.. Ich übergebe doch die Adresse von strlist und weise dann der Adresse von "list", also dem Pointer auf TStringlist die übergebene Adresse zu und greife auf das Objekt per derefferenzierung zu...

Ich hoffe hier schlauer zu werden, danke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#2

AW: CreateThread Parameterübergabe

  Alt 30. Mai 2015, 22:15
Du gibst einen Pointer auf die Variabe als Parameter rein, castest es später aber als TStringList, wo es doch eine PStringList ist
und das auch noch bei einer Variable, welche inzwischen nichtmal mehr existiert, da StartGrab schon beendet wurde und somit seine Variablen weg sind.

Objekte sind schon Pointer, die man einfach nach Integer/NativeInt/IntPtr/Pointer casten kann.


Und wozu ist strList eigentlich ein Var-Parameter?

PS: CloseHandle prüft selber auf 0, also kann man sich die Prüfung sparen, wenn mann mag.
Delphi-Quellcode:
tHWND:=CreateThread(nil, 0, TFNThreadStartRoutine(@GetProxys), @strList, 0, tID);
CloseHandle(tHWND);

CloseHandle(CreateThread(nil, 0, TFNThreadStartRoutine(@GetProxys), @strList, 0, tID));
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (30. Mai 2015 um 22:22 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz