AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi non-vcl Thread innerhalb einer Klasse deklarieren
Thema durchsuchen
Ansicht
Themen-Optionen

non-vcl Thread innerhalb einer Klasse deklarieren

Ein Thema von Nogge · begonnen am 3. Aug 2007 · letzter Beitrag vom 6. Aug 2007
 
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#19

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 13:33
Mh, ich habe das mal getestet, allerdings wird der Zeiger auf den/die Parameter nicht korrekt übergeben, sodass jedesmal eine Zugriffsverletzung in TMyDialog.SaveThread erscheint.
Delphi-Quellcode:
procedure TMyDialog.createSpecificThread(methodAddr: Pointer;
  var Parameter: TFileTransferList);
var
  AThreadHandle : Integer;
  //Param : PParam;
begin
  {New(Param);
    Param^.AObject := Parameter;}


  AThreadHandle := beginThread(methodAddr, Parameter);

  if (AThreadHandle > 0) then
  begin
    // warten, bis sich der Thread geschlossen hat
    if (WaitForSingleObject(AThreadHandle, INFINITE) <> WAIT_OBJECT_0) then
    begin
      ShowMsg('ERROR(WaitForSingleObject): Cannot close thread!', '', MB_ICONERROR);
    end;
    CloseHandle(AThreadHandle);
  end;
end;

[...]

function TNonVCLThread.beginThread(methodAddr: Pointer; Parameter: Pointer): Integer;
var
  method : TMethod;
  ThreadID : Cardinal;
begin
  method.Code := methodAddr;
  method.Data := self;
  // converts method to function pointer
  FProcInst := MakeProcInstance(method);
  // creates the thread
  result := System.BeginThread(nil, 0, FProcInst, Parameter, 0, ThreadID);
end;

[...]

// Aufruf
procedure TMyDialog.SaveFiles;
var
  files: TFileTransferList;
begin
  files := TFileTransferList.Create();
  [...] // files.add usw.
  createSpecificThread(@TMyDialog.SaveThread, files);
end;

[...]

function TMyDialog.SaveThread(Ptr: Pointer): DWORD; stdcall;
var
  Param : PParam;
  files : TFileTransferList;
  len : Integer;
begin
  result := 0;

  {Param := PParam(Ptr);
  try
    files := TFileTransferList(Param^.AObject);
  finally
    Dispose(Param);
  end;}


  files := TFileTransferList(Ptr);
  try
    BytesCount := 0;
    len := files.Count; // <- AV bzw. ein ungültiger int-Wert
    for i := 0 to len-1 do
  [...]
end;
  Mit Zitat antworten Zitat
 


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