AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi BeginThread mit 64bit compiler [gelößt]
Thema durchsuchen
Ansicht
Themen-Optionen

BeginThread mit 64bit compiler [gelößt]

Ein Thema von OlliWW · begonnen am 22. Jan 2015 · letzter Beitrag vom 23. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
OlliWW

Registriert seit: 31. Aug 2011
159 Beiträge
 
#1

BeginThread mit 64bit compiler [gelößt]

  Alt 22. Jan 2015, 10:32
Hallo Zusammen,

Ich stelle gerade meine Anwendung auf 64bit um. Der Code funktioniert soweit, bloss beim Aufruf von einem Thread kriege ich immer wieder einen Absturz, ich verstehe allerdings nicht warum, den Thread hab ich eigentlich nach Delphi-Beispiel nachprogrammiert:

Delphi-Quellcode:
interface
type
  TMsgRecord = record
    sPath: String;
    sIdent: String;
  end;

implementation

uses [...];

ThreadVar
  msgPtr : ^TMsgRecord;



function TFrom1.fctCheckSystem:Boolean;
[....]
  procedure prcDirectoryExists(_pPfad: Pointer);
  var
    sPfad: String;
    sIdent: String;
    msgData: TWMMessageData;
  begin
    msgPtr := _pPfad;
    sPfad := msgPtr.sPath;
    sIdent := msgPtr.sIdent;
  [..]
  end;

  procedure prcCheckPaths;
  var
    rec_ThreadParams: TMsgRecord;
    aThreadID: array of DWord;
    hndThread: THandle;
    objINIPath: TINIPath;
  begin
  [..]
    SetLength(aThreadID, lstPaths.Count);
    for i1 := 0 to lstPaths.Count - 1 do
    begin
      rec_ThreadParams.sPath := lstPaths[i1].sPath;
      rec_ThreadParams.sIdent := lstPaths[i1].sIdent;
      hndThread := BeginThread(nil, 0, @prcDirectoryExists, Addr(rec_ThreadParams), 0, aThreadID[i1]);
      CloseHandle(hndThread);
    end;
  end;
end;

Sobald ich auf "msgPtr.sPath" zugreife stürzt mir meine Anwendung ab, weil Sie anscheinend nicht auf den Pointer zugreifen kann.
Hat jemand einen Tipp für mich?

Geändert von OlliWW (23. Jan 2015 um 09:00 Uhr)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 10:48
Ächz...

Was für ein Delphi hast Du denn? Kennst Du anonyme Threads und Prozeduren? Damit kannst Du mit ein paar Zeilen verständlichem Code ohne Pointergeraffel schöne Sachen machen.

Delphi-Quellcode:
TThread.CreateAnonymousThread(
procedure
// do anything here
begin
end).Start;
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.

Geändert von taveuni (22. Jan 2015 um 10:51 Uhr)
  Mit Zitat antworten Zitat
OlliWW

Registriert seit: 31. Aug 2011
159 Beiträge
 
#3

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 11:02
Delphi XE6

Das komisch ist, dass der Code (in leicht abgewandelter Form) unter 32 bit funktioniert.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 11:03
Delphi XE6

Das komisch ist, dass der Code (in leicht abgewandelter Form) unter 32 bit funktioniert.
Vielleicht läuft er auf 64 Bit auch, wenn man ihn ine eine leicht abgewandelter Form bringt.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 11:11
Was ist lstPaths? Gibt es diesen (und den Inhalt) die ganze Zeit? Wenn nicht werden deine Strings freigegeben und unter Win32 funktioniert es halt nur zufällig.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
OlliWW

Registriert seit: 31. Aug 2011
159 Beiträge
 
#6

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 11:23
[QUOTE=mkinzler;1287408]
Vielleicht läuft er auf 64 Bit auch, wenn man ihn ine eine leicht abgewandelter Form bringt.
Nein ich habe es natürlich erst in "unabgewandelter" Forum versucht => Absturz
Dann habe ich gesehen dass der Record ein packed Record ist, und laut Embarcadero beim wechsel zu 64bit sollte auf Packed verzichtet werden.
Dann hab ich den Thread so erstellt wie bei Embarcadero beschrieben, das ist das o.g. Code Beispiel, stürzt aber auch ab.


Den Hinweiß mit den Listen gehe ich jetzt nach
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 12:13
Nicht böse gemeint, nur interessiert: Warum tut man sich das mit den Threads so an? Das mit TThread aus System.Classes ist doch eigentlich wirklich schön gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 12:20
den Thread hab ich eigentlich nach Delphi-Beispiel nachprogrammiert
Kannst Du mal dieses Beispiel verlinken? Ist das noch aus dem letzten Jahrtausend?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
OlliWW

Registriert seit: 31. Aug 2011
159 Beiträge
 
#9

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 12:49
Hier hab ich das Beispiel her,

Ich werde mir aber auch die TThread Klasse ansehen:

http://www.delphibasics.co.uk/RTL.asp?Name=BeginThread
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#10

AW: BeginThread mit 64bit compiler

  Alt 22. Jan 2015, 21:37
Ist niemand aufgefallen das rec_ThreadParams auf dem Stack liegt?
Dem Thread wird nur die Adresse von rec_ThreadParams übergeben. Wenn prcCheckPaths zurückkehrt ist der Inhalt der Variable undefiniert. Der Thread greift über den Zeiger auf den String zu, der einen weiteren, ungültigen Zeiger enthält: Boom!

Eine schnelle Lösung zum Ausprobieren wäre es, rec_ThreadParams mal global zu definieren. Ansonsten: Benutze TThread
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 16:39 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