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

non-vcl Thread innerhalb einer Klasse deklarieren

Ein Thema von Nogge · begonnen am 3. Aug 2007 · letzter Beitrag vom 6. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2   
Nogge

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

non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 09:00
Hallo Community,
Ich stehe gerade vor einem Syntaxproblem (jedenfalls hoffe ich das ganz stark!). Ich möchte eine non-vcl-Thread-Klasse erstellen, die in etwa so aussehen sollte:

Delphi-Quellcode:
TMyClass = class
  private
    [...]
    TMyThread = function dummyThread(Ptr: Pointer): DWORD; //funzt so leider nicht
    myThread: TMyThread;
  public
    procedure callThread();
  end;

[...]

function TMyDialog.dummyThread(Ptr: Pointer): DWORD; // dummyThread ist Bestandteil der Klasse TMyDialog
begin
  result := 1;
end;

procedure TMyDialog.callThread();
begin
  tHandle := BeginThread([...], @myThread, [...]);
  tHandle := BeginThread([...], @dummyThread, [...]); // Syntaxfehler!
end;
BeginThread verlangt eine Variable vom Typ TThreadFunc und genau das ist das Problem. Sobald dummyThread als Bestandteil einer Klasse deklariert wird, ist es keine Variable mehr. Kann mir jemand sagen, ob man dies iwie umgehen kann?

mfg Nogge
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 09:05
das TMyThread = function dummyThread(Ptr: Pointer): DWORD; ist eine Typdeklaration, keine Variablendeklaration.

Entweder so
Delphi-Quellcode:
TMyClass = class
  private
    [...]
    type
      TMyThread = function dummyThread(Ptr: Pointer): DWORD;
    var
      myThread: TMyThread;
  public
    procedure callThread();
  end;
Oder du willst das anderes erreichen...

/EDIT: Ich sehe gerade, du nutzt Delphi 7, somit würde das nicht funktionieren...
  Mit Zitat antworten Zitat
Nogge

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

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 09:08
Ja, genau - das funktioniert so leider nicht. Gibt's da keine Lösung für ältere Delphiversionen bzw. für Version 7?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 09:12
Du hast das Problem das ThreadFunc eine einfache Funktion sein muss, und keine Methode.
Du musst also erstmal eine "einfache" Dummy-funktion erstellen und in dem einen Parameter pübergibst du halt einen Pointer auf eine Variable TMethod (ähnlich, wie es TThread macht) und kannst dann die Thread-Methode aufrufen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 10:06
Damit habe ich mich gerade gestern erst auseinandergesetzt: Windows-API Callback-Funktion als Methode einer Klasse (Es sind noch ein paar Tippfehler enthalten, werde ich gleich korrigieren.)
Das funktioniert natürlich nicht nur mit Callback-Funktionen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 10:21
Das funktioiert doch aber nur, wenn ich den durch getmem angeforderten Speicherbereich auch ausführen darf Luckie. Und wann gibts du den Speicher wieder frei?

Edit:
Ich dachte doch eher an sowas (habs jetzt nicht getestet):
Delphi-Quellcode:

function threaddispatcher(Method:ppointer):integer;stdcall;
var ThreadProc:function:integer of object;
begin
  ThreadProc:=Method^;
  freemem(Method,8);
  result:=ThreadProc;
end;

//...
var p:pointer;

getmem(p,8);
move(@TMyDialog.dummyThread,p^,8);
Beginthread(...,@threaddispatcher,...,p,...);
Naja, irgendwie so halt.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 10:24
Freigeben tue ich den Speicher wieder im Destruktor der Klasse (siehe dazu die Demo).
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 10:30
Na gut, aber ich dachte mit getmem angeforderten Speicher kann man nicht ausführen. Da müsste man ja noch ein virtualprotect vorbeischicken.
Edit: Aber funktioniert ja
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Nogge

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

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 10:32
Schon mal vielen Dank im Voraus, Lucky!
Allerdings bedarf es für mich (und best auch einigen anderen, die sich näher für deine Lösung interessieren) einer detailierteren Erklärung:

Zitat:
Ein Feld mit einem Zeiger für den Code und ein Feld mit einem Zeiger auf die Instanz.
[...]
Man legt einen ausführbaren Speicherbereich an und schreibt in diesen die beiden Zeiger, den Aufruf der Methode und die Return-Anweisung. Den Zeiger auf diesen Speicherbereich kann man nun als Funktionszeiger der Callback-Funktion übergeben.
1. Wieso werden hier genau 15 Bytes alloziiert?
2. "Aufruf der Methode" == Adresse der Methode? Seltsam, denn ich dachte, dass der erste Zeiger auf den Code bereits dies symbolisiert.
3. Ein Funktionszeiger einer Callback-Funktion ist also ein "erweiterter" Zeiger einer Methode?
4. Wieso hast du in deinem asm-Code alle Instruktionen mit mov-Instruktionen ersetzt?

P.S. Du hast da zwei Rechtschreibfehler eingebaut:
Zitat:
Ein Methodenzeiger ist letzendlich nichts anderes als ein yeiger auf ein Record mit zwei Feldern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: non-vcl Thread innerhalb einer Klasse deklarieren

  Alt 3. Aug 2007, 10:36
Also bei mir funktioniert es. Allerdings, ob es das bei Prozessoren auch tut, die die verhindern könne, dass Code im Datenbereich ausgeführt wird, müsste man noch mal gucken. Und unter Vista ist es noch nicht getestet.

Wie würde denn dein Code mit VirtualProtect aussehen?

@Nogge: Den Code habe ich von den Schweizern übernommen. Zu dem ASM-teil wollte ich sowieso selber noch ein paar Verständnisfragen stellen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 14:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf