Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Probleme mit Threads und deren übergabe (wartezeit) (https://www.delphipraxis.net/73618-probleme-mit-threads-und-deren-uebergabe-wartezeit.html)

BassFan 20. Jul 2006 16:34


Probleme mit Threads und deren übergabe (wartezeit)
 
Langsam komm ich nicht mehr klar..

Warum werden anweisungen die man in Delphi übergibt nicht sofort ausgeführt.
Wenn ich mein HWND erhalten habe warum kann ich es dann nicht direkt übergeben?

In VB gibt es die GET/LET funktionen
Was mit Let übergeben wird kann mit Get direkt ohne umwege zurück geholt werden.
Bei Delphi kommt Meldung : Linke seite kann nix zugewiesen werden.

Wenn ich einen neuen thread beginne warum wird dieser nicht erst abgearbeitet bevor
eine neue Function übergeben wird?

Der Code soll folgendermaßen abgearbeitet werden.

Thread erstellen mit BeginThread(xxx ..)
Im Thread! Sobald die Klasse Window erstellt ist ist auch das Handle des Window bekannt
dieses möchte ich ohne umwege direkt übergeben damit es der Anwendung bekannt ist
bevor das Plugin gestartet wird.

Ist zwar VB habe es aber mal mit Delphi Formatiert dann kann man es besser lesen.
Hier mal der Ablauf
Delphi-Quellcode:
        //Das ausgewählte Plugin starten
        If (lstPlugins.ListIndex >= 0) Then
            alist = Split(lstPathList.List(lstPlugins.ListIndex), ",")
            //Neuen Thread erstellen
            VisChan = BASS_WINAMPVIS_CreateVis(alist(0), CLng(Combo1.ListIndex), 0)
            //Song Titel übergeben
            Text1.Text = "Hmmmmmmm was nun."
            //Update intervall für Timer übergeben
            HScroll4.Enabled = False
           
            //Hwnd des Winamp Emulations Fenster erfragen
            hwndWinamp = BASS_WINAMPVIS_GetAmpHwnd
            lblWHandle = hwndWinamp
            //ShowWindow hwndWinamp, SW_SHOW
           
            //Position der Playliste setzen
            SendMessage ByVal hwndWinamp, WM_USER, ByVal PLPos, ByVal IPC_SETPLAYLISTPOS
            //Datei Infos übergeben
            //VisChan = Handle
            //Text1 = Title
            //Text2 = Filename
            //0 = Songposition
            //1800 = Songlänge
            //PLPos = Playlist Position
            //20 = Playlist Einträge
            BASS_WINAMPVIS_SetChanInfo VisChan, Text1, Text2, 0, 1800, PLPos, 20
            //Aktuell gesetze Playlist Position erfragen
            lblPos = Winamp_GetPlaylistPos

            //Timer einschalten
            If m_lId = 0 Then
                m_lId = timeSetEvent(HScroll4.Value, 300, AddressOf TimerProc, TimerhWnd, TIME_PERIODIC)
            End If
            //Plugin Windowhandle erfragen und zuweisen
            Label6.Caption = BASS_WINAMPVIS_GetVisHwnd
           
            //Wenn mehr als 0 Window Handle an MagneticWindow übergeben
            If Label6.Caption > vbNullString Then
                oMagneticWindow.AddWindow CLng(Label6.Caption), Me.hwnd
            End If
           
            Timer1.Enabled = True
           
        End If
Nach übergabe von CreateVis wird die function im Plugin nicht vollständig abgearbeitet
was bedeutet es findet schon die abfrage nach dem hwndWinamp statt welches
bis da noch nicht ermittelt wurde.

Ist Delphi so langsam ? oder wo liegt das Problem.

Delphi-Quellcode:
  WinAtom := Windows.RegisterClassEx(wClass);

  if WinAtom <> 0 then
    Result := CreateWindowEx(0, AppClass, AppTitle,
      WS_POPUP,      // Kein Frame, Unsichtbar
      0, 0, 275, 116, // x, y, width, height
      {parent} 0, 0, hInst, nil)
  else
    Result := 0;


  // Hwnd von der ausführenden Anwendung
  if AppParentHandle <> 0 then
  begin
    AmpHandle := 0;
    VisPlgHandle := Result;

    repeat
       amphandle := BASS_WINAMPVIS_GetAmpHwnd;
    until amphandle <> 0;
Sobald das Window erstellt wurde ist das amphandle bekannt
Wird aber wie schon beschrieben vorher abgefragt..
Das kann es doch nicht sein.

WIe reglet man das in Delphi das die Reihenfolge abgearbeitet wird und nicht alles auf einmal.

gruß
da

Christian Seehase 20. Jul 2006 17:13

Re: Bekomme die Krise
 
Moin da,

ändere bitte mal den Titel Deines Threads.
Mit "Bekomme die Krise" kann keiner etwas anfangen.

Der_Unwissende 20. Jul 2006 17:33

Re: Bekomme die Krise
 
Hi,
ich finde es schön, dass du dir Mühe gibt's mein Bild von VB Programmierern zu stärken :mrgreen:

Da ich deinen Quellcode doch etwas schlecht lesbar finde, noch mal kurz zu deinem Problem. Du möchtest einen Thread starten und mit einem Ergebnis aus dem Thread weiterarbeiten?
Also wenn du fragst ob Delphi so langsam ist, ganz ehrlich, ich würde sagen du hast Threads noch nicht verstanden. Du solltest dich freuen, wenn es bei dir nicht klappt! Schlimmer ist es, wenn es (rein zufällig) bei dir funktionieren würde und so ein Produkt mal verkauft wird. Bei nebenläufigen Prozessen kannst du nicht selbst festlegen, wann diese ausgeführt werden. Wenn du auf ein bestimmtes Ergebnis warten möchtest, dann solltest du einfach darauf warten! Dafür gibt es Methoden, die können auf gewisse Signale warten.
Was atomar in einem Thread (auf einmal) stattfinden soll, legt man über Sperrsynchronisation fest (kenn ich so in jeder Sprache). Das du in einer anderen Sprache bei einem Thread eine gewisse Anzahl von Schritten in diesem Thread zusichern kannst, bevor es zur weiteren Abarbeitung in einem anderen Thread kommt gibt es nicht. Das ist gerade das, was Threading so fehleranfällig macht.
Ich würde dir dringend raten, dich erst mit den Grundlagen des Threadings zu beschäftigen. Dann verstehst du (hoffentlich) schnell, dass du dich nie auf irgendwas verlassen solltest, was du nicht selbst festlegst. Die Fehler die du dir sonst in deinen Code holst sind echt schwer zu debuggen. Könnte dann auch sein dass es einfach 200 mal gut geht und die nächsten Male immer knallt, nur leider nie wenn du gerade debuggst...

Gruß Der Unwissende

Bernhard Geyer 20. Jul 2006 17:34

Re: Bekomme die Krise
 
Hallo BassFan,

ich geh mal nur auf deine allgemeinen Probleme mit Delphi ein und nicht auf deinen VB-Quellcodeauszug. Dazu müsstest Du noch erklären was die einzelnen Funktionen wie BASS_WINAMPVIS_CreateVis machen:

Zitat:

Warum werden anweisungen die man in Delphi übergibt nicht sofort ausgeführt.[/delphi]
Werden sie. Gib ein Beispiel das dies nicht wäre.

Zitat:

Wenn ich mein HWND erhalten habe warum kann ich es dann nicht direkt übergeben?
Wohin direkt übergeben? Ein Win32-API aufzurufen oder was?

Zitat:

In VB gibt es die GET/LET funktionen
Was mit Let übergeben wird kann mit Get direkt ohne umwege zurück geholt werden.
Das gibt es in Delphi als properties auch.

Zitat:

Bei Delphi kommt Meldung : Linke seite kann nix zugewiesen werden.
Dann wird es wohl ein Read-Only-Property sein. Ein Fensterhandle (Handle-Property von TWinControl-Komponenten) kannst Du nicht zuordnen da dies ja im Konstruktor der Komponenten mittels Win32-API-Funktionen geholt wird und ein Zuweisen eines anderen Wertes das Fensterhandling von Windows und Delphi durcheinander bringen würde.

Zitat:

Wenn ich einen neuen thread beginne warum wird dieser nicht erst abgearbeitet bevor
eine neue Function übergeben wird?
Ich glaube du verwechselt etwas. Der Sinn eines Threads ist doch die unabhängige Abarbeitung einer Aufgabe.

BassFan 20. Jul 2006 18:15

Re: Bekomme die Krise
 
Hi
Zitat:

Dazu müsstest Du noch erklären was die einzelnen Funktionen wie BASS_WINAMPVIS_CreateVis machen:
BASS_WINAMPVIS_CreateVis beginnt einen neuen Thread (ThreadHandle := BeginThread(nil, 0, @WinampVisWin, VisInfo, 0, ThreadId);)

Zitat:

Werden sie. Gib ein Beispiel das dies nicht wäre.
Hier.
Delphi-Quellcode:
    repeat
       amphandle := BASS_WINAMPVIS_GetAmpHwnd;
    until amphandle <> 0;
Ohne diese schleife kann die Hauptanwendung das HWND nicht schnell genug in erfahrung bringen.

Zitat:

Wohin direkt übergeben? Ein Win32-API aufzurufen oder was?
An meine Hauptanwendung.
Diese holt sich das HWND über die Function
Delphi-Quellcode:
function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall;

begin
    //repeat
    Result := VisPlgHandle;
    //until VisPlgHandle <> 0
end;
Zitat:

Das gibt es in Delphi als properties auch.
Bitte ein Beispiel.

Zitat:

Dann wird es wohl ein Read-Only-Property sein. Ein Fensterhandle (Handle-Property von TWinControl-Komponenten) kannst Du nicht zuordnen da dies ja im Konstruktor der Komponenten mittels Win32-API-Funktionen geholt wird und ein Zuweisen eines anderen Wertes das Fensterhandling von Windows und Delphi durcheinander bringen würde.
Würde ich das HWND =BASS_WINAMPVIS_GetAmpHwnd
über Property GET/LET übergeben und lesen können wäre mir schon geholfen.
Kenne die Befehlsstruktur dafür in Delphi nicht.

Zitat:

Ich glaube du verwechselt etwas. Der Sinn eines Threads ist doch die unabhängige Abarbeitung einer Aufgabe.
Ja Sorry mein Problem generell kenn mich in Delphi nicht so aus.
Möchte aber gerne lernen soweit ich konstuktive Informationen erhalte.

Gruß

BassFan 20. Jul 2006 18:17

Re: Bekomme die Krise
 
Zitat:

Zitat von Der_Unwissende
Hi,
ich finde es schön, dass du dir Mühe gibt's mein Bild von VB Programmierern zu stärken :mrgreen:

Da ich deinen Quellcode doch etwas schlecht lesbar finde, noch mal kurz zu deinem Problem. Du möchtest einen Thread starten und mit einem Ergebnis aus dem Thread weiterarbeiten?
Also wenn du fragst ob Delphi so langsam ist, ganz ehrlich, ich würde sagen du hast Threads noch nicht verstanden. Du solltest dich freuen, wenn es bei dir nicht klappt! Schlimmer ist es, wenn es (rein zufällig) bei dir funktionieren würde und so ein Produkt mal verkauft wird. Bei nebenläufigen Prozessen kannst du nicht selbst festlegen, wann diese ausgeführt werden. Wenn du auf ein bestimmtes Ergebnis warten möchtest, dann solltest du einfach darauf warten! Dafür gibt es Methoden, die können auf gewisse Signale warten.
Was atomar in einem Thread (auf einmal) stattfinden soll, legt man über Sperrsynchronisation fest (kenn ich so in jeder Sprache). Das du in einer anderen Sprache bei einem Thread eine gewisse Anzahl von Schritten in diesem Thread zusichern kannst, bevor es zur weiteren Abarbeitung in einem anderen Thread kommt gibt es nicht. Das ist gerade das, was Threading so fehleranfällig macht.
Ich würde dir dringend raten, dich erst mit den Grundlagen des Threadings zu beschäftigen. Dann verstehst du (hoffentlich) schnell, dass du dich nie auf irgendwas verlassen solltest, was du nicht selbst festlegst. Die Fehler die du dir sonst in deinen Code holst sind echt schwer zu debuggen. Könnte dann auch sein dass es einfach 200 mal gut geht und die nächsten Male immer knallt, nur leider nie wenn du gerade debuggst...

Gruß Der Unwissende

Danke für das Maßregeln !
Hilft mir aber in keiner weise irgendwie weiter..
Also Dekonstruktiv

Gruß

SirThornberry 20. Jul 2006 19:41

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
@BassFan: benutze nächstes mal bitte die "Edit"-Funktion wenn du deinem letzten Beitrag etwas hinzufügen willst ohne das zwischenzeitlich jemand anderes was geschrieben hast oder 24 stunden seit deinem leiten Beitrag vergangen sind. Ansonsten nennt man das pushen was hier nicht erlaubt ist. Desweiteren möchte ich dich bitten deinem Thema einen aussagekräftigen Titel zu verleihen so wie es die Forenregeln besagen.

BassFan 20. Jul 2006 19:59

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Zitat:

Zitat von SirThornberry
@BassFan: benutze nächstes mal bitte die "Edit"-Funktion wenn du deinem letzten Beitrag etwas hinzufügen willst ohne das zwischenzeitlich jemand anderes was geschrieben hast oder 24 stunden seit deinem leiten Beitrag vergangen sind. Ansonsten nennt man das pushen was hier nicht erlaubt ist. Desweiteren möchte ich dich bitten deinem Thema einen aussagekräftigen Titel zu verleihen so wie es die Forenregeln besagen.

Welcher Titel ist denn genehm ?
Habe ihn schon geändert von Langsam bekomme ich die Krise nach ,,,, Probleme mit Threads und deren übergabe (wartezeit)
Was ist da nun nicht aussagekräftig genug?

Benutze immer den Edit Knopf wenn ich etwas im Artikel ändern möchte.
Neue Frage neuer Artikel.
Was ist daran verkehrt.. Oder kann es sein das man mich hier herauspushen will ? Mobbing nennt man das
wenn man hinter jemanden her ist der nichts verbrochen hat.

Oder sollte ich hier jemand beleidigt haben ?

gruß

SirThornberry 20. Jul 2006 20:06

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Der Titel ist genehm, es war mein Fehler, hatte mich da vertan. :oops:
Zitat:

Benutze immer den Edit Knopf wenn ich etwas im Artikel ändern möchte.
Neue Frage neuer Artikel.
Was ist daran verkehrt.. Oder kann es sein das man mich hier herauspushen will ? Mobbing nennt man das
wenn man hinter jemanden her ist der nichts verbrochen hat.
Neue Frage = Neuer Artikel ist richtig sofern du mit Artikel das Thema meinst.
Allerdings hast du 19:15 gepostet und 19:17 wieder ohne etwas neues zum Thema beizutragen. Durch den neuen Beitrag kommt dein Thema auf auf der Portalseite nach ganz oben und andere Beiträge verschwinden dahinter. Aus diesem Grund ist das sogenannte Pushen bei uns erst nach 24 Stunden erlaubt oder wenn es etwas neues gibt.

BassFan 20. Jul 2006 20:12

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Zitat:

Zitat von SirThornberry
Der Titel ist genehm, es war mein Fehler, hatte mich da vertan. :oops:
Zitat:

Benutze immer den Edit Knopf wenn ich etwas im Artikel ändern möchte.
Neue Frage neuer Artikel.
Was ist daran verkehrt.. Oder kann es sein das man mich hier herauspushen will ? Mobbing nennt man das
wenn man hinter jemanden her ist der nichts verbrochen hat.
Neue Frage = Neuer Artikel ist richtig sofern du mit Artikel das Thema meinst.
Allerdings hast du 19:15 gepostet und 19:17 wieder ohne etwas neues zum Thema beizutragen. Durch den neuen Beitrag kommt dein Thema auf auf der Portalseite nach ganz oben und andere Beiträge verschwinden dahinter. Aus diesem Grund ist das sogenannte Pushen bei uns erst nach 24 Stunden erlaubt oder wenn es etwas neues gibt.

Verstehe ich nicht Sorry diese Argumentation.

19.15 habe ich auf das Thema von 'Bernhard Geyer' geantwortet.
19.17 auf das von 'Der_Unwissende'

Also beide sind eine Antwort würdig. Oder ?
Nun in aller Freundschaft was hat das mit Pushen zu tun.

gruß

Christian Seehase 20. Jul 2006 20:32

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Moin BassFan,

woher stammt denn

VisPlgHandle

in

Delphi-Quellcode:
function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall;

begin
    //repeat
    Result := VisPlgHandle;
    //until VisPlgHandle <> 0
end;
?

Ist das eine Funktion, wenn ja, was macht die genau?
Ist das eine Variable, wenn ja, wie wird die gefüllt?


Zitat:

Zitat von BassFan
Zitat:

Das gibt es in Delphi als properties auch.
Bitte ein Beispiel.


Delphi-Quellcode:
type
  TMyType = class(TObject)
  private
    function GetIrgendeineEingenschaft: TBeispiel;
    procedure SetIrgendeineEigenschaft(const Value: TBeispiel);
  public
    property IrgendEineEigenschaft : TBeispiel read GetIrgendeineEingenschaft write SetIrgendeineEigenschaft;
  end;

BassFan 20. Jul 2006 20:51

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Auch Moin :-D

Zitat:

woher stammt denn

VisPlgHandle

in
Delphi-Quellcode:
function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall;

begin
    //repeat
    Result := VisPlgHandle;
    //until VisPlgHandle <> 0
end;
?

Zitat:

Ist das eine Funktion, wenn ja, was macht die genau?
Ist das eine Variable, wenn ja, wie wird die gefüllt?
VisPlgHandle ist das HWND der APPClass 'Winamp v1.x'

Bitte hier ist nochmal die ganze Routine welche das API-Fenster erstellt.

Delphi-Quellcode:
function WinampVisWin(VisInfo: PWinampVisInfo): HWND;
var
  WinAtom: TAtom;
  wClass: TWNDCLASSEX;
  Msg:    TMsg;
  AppREC: Trect;
const
  AppClass = 'Winamp v1.x'; // Übergebe den ClassenNamen
  AppTitle = 'Winamp 5.2'; // Übergebe den Window Titel (Caption)
begin

  if VisPlgHandle <> 0 then // Erstelle das VisDummy Fenster
  begin
    try
      UnRegisterClass(AppClass, hInst);
      hInst := 0;
      VisInfo^.Init2 := False;
      VisPlgHandle := 0;
    except
      Messagebox(0,'Winamp Emulations Fenster konnte nicht erstellt werden',
                 'Fatal Error!!', MB_ICONERROR);
    end;
  end;

  hInst := GetModuleHandle(nil); // Hole die Apllikations Instanz

  with wClass do
  begin
    cbSize    := sizeof(wClass);
    Style     := CS_PARENTDC or CS_VREDRAW;
    lpfnWndProc := @WinampVisWndProc;
    cbClsExtra := 0;
    cbWndExtra := 0;
    hInstance := hInst;
    hIcon     := 0;
    hCursor   := LoadCursor(0, IDC_ARROW);
    hbrBackground := COLOR_BTNFACE + 1;
    lpszMenuName := nil;
    lpszClassName := AppClass;
    hIconSm   := 0;
  end;

  // Classe registrieren. Bei erfolg das Window erstellen
  WinAtom := Windows.RegisterClassEx(wClass);

  if WinAtom <> 0 then
    Result := CreateWindowEx(0, AppClass, AppTitle,
      WS_POPUP,      // Kein Frame, Unsichtbar
      0, 0, 275, 116, // x, y, width, height
      {parent} 0, 0, hInst, nil)
  else
    Result := 0;

  // Hwnd von der ausführenden Anwendung
  if AppParentHandle <> 0 then
  begin
    AmpHandle := 0;
    VisPlgHandle := Result;

    repeat
       AmpHandle := BASS_WINAMPVIS_GetAmpHwnd;
    until amphandle <> 0;
    // Den WindowRecord der Hauptanwendung in erfahrung bringen
    GetWindowRect(AppParentHandle, AppREC);
    // Das API-Fenster AppClass Winamp v1.x den Ausmaßen anpassen
    // wird verwendet wenn Plugin's eine Docking funktion anbieten.
    MoveWindow(VisPlgHandle, 0, 0, AppREC.Right - AppREC.Left, AppREC.Bottom - AppREC.Top, True);
  end
  else

  VisPlgHandle := Result;

  VisInfo^.WinHandle := VisPlgHandle;
  WinampVisExecute(Filename, Vismod, VismodCounter, VisPlgHandle);

  // ParentWindow den Plugins zuweisen
  VisInfo^.VisModule^.hwndParent := VisPlgHandle;
  // Plugin Initialisieren und ausführen
  VisInfo^.VisModule^.Init(VisInfo^.VisModule);
  // Das API-Fenster AppClass Winamp v1.x als ParentFenster in
  // die Hauptanwendung (AppParentHandle) verschieben
  SetParent(VisPlgHandle, AppParentHandle);

  // Das FensterHandle HWND des Plugins der Hauptanwendung
  // für weitere, dort ausgeführte funktionen übermitteln.
  Repeat
  PluginHandle := GetWindow(VisInfo^.VisModule^.hwndParent, GW_HWNDPREV);
  until PluginHandle <> 0;

  IsPlaying := 1;
  if IsPlaying > 0 then
    VisInfo^.Init2 := True
  else
    VisInfo^.Init2 := False;

  while (GetMessage(Msg, 0, 0, 0)) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

  VisInfo^.Init2 := False;

  UnregisterClass(AppClass, 0);

  W_RemoveHandle(DWORD(VisInfo));

  VisInfo^.VisModule^.Quit(VisInfo^.VisModule);

  DestroyWindow(VisInfo^.WinHandle);

  if (VisInfo^.Title <> nil) then
    StrDispose(VisInfo^.Title);

  FreeLibrary(VisInfo^.DllInstance);
  FreeMem(VisInfo);

  VisInfo^.WinHandle := 0;

  Result := 0;
end;
Habe es kommentiert damit man etwas besseren durchblick hat.

Gruß

BassFan 20. Jul 2006 21:59

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Habe es mal so gemacht!

Delphi-Quellcode:
  TAmpHwnd = class(TObject)
  private
    function GetAmpHwnd: DWORD; stdcall;
    procedure SetAmpHwnd(const Value: DWORD);
  public
    property BASS_WINAMPVIS_GetAmpHwnd : DWORD read GetAmpHwnd write SetAmpHwnd;
  end;
Delphi-Quellcode:
function TAmpHwnd.GetAmpHwnd: DWORD; stdcall;

begin

end;

procedure TAmpHwnd.SetAmpHwnd(const Value: DWORD);

begin

end;
Allerdings steht noch nichts in der Function und der Procedure da ich nicht sicher bin ob sie so richtig angewendet wurden.
Ein paar Fragen hätte ich noch.

1.Ist das Objekt TAmpHwnd in einer DLL funktionel oder gehört dieses nicht zu einer Unit ? Sorry falls die Frage dumm sein sollte.
2.Was mache ich nun mit der Public 'property BASS_WINAMPVIS_GetAmpHwnd : DWORD read GetAmpHwnd write SetAmpHwnd;'
3.Meine ausgabe funktion zur Anwendung war 'BASS_WINAMPVIS_GetAmpHwnd' Wie biege ich das nun so hin das sie wieder verwendbar ist ?
4. mit dem 'stdcall' bin ich mir auch nicht sicher! Kann es sein das diese an der Public function angehängt werden muss?
macht ja bei Privat eigentlich keinen sinn da sie von dort aus nicht exportiert wird.

Nachtrag: property wird doch nur abgearbeitet oder? Müßte das in meinen Fall nicht eine Function sein
da sie ja einen Rückgabe wert enthalten muss zur Hauptanwendung.

Gruß

Jelly 20. Jul 2006 22:14

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Zitat:

Zitat von BassFan
1.Ist das Objekt TAmpHwnd in einer DLL funktionel oder gehört dieses nicht zu einer Unit ? Sorry falls die Frage dumm sein sollte.

Tut zwar nix zum Thema, aber in einer DLL kannst du keine Klassen Methoden oder Properties exportieren, sondern nur globale Prozeduren oder Funktionen. In diesen kannst du natürlich ein Objekt erzeugen, und eine beliebige Funktion oder Property abrufen.

Zitat:

Zitat von BassFan
2.Was mache ich nun mit der Public 'property BASS_WINAMPVIS_GetAmpHwnd : DWORD read GetAmpHwnd write SetAmpHwnd;'

Beim Lesen der Eigenschaft wird die Methode GetAmpHwnd aufgerufen (funktion), beim Schreiben die Methode SetAmpHwnd. Es ist sinnvoll, zusätzlich eine private Variable zu deklarieren, in der die SetAmpHwnd einen Wert setzen kann. Diese Variable werden üblicherweisen mit einem F als Präfix definiert, also in deinem Fall FBASS_WINAMPVIS_GetAmpHwnd.

Wobei dein Name der Property BASS_WINAMPVIS_GetAmpHwnd äusserst schlecht gewählt ist... Ich würd eher einfach BASS_WINAMPVIS definieren, mit den entsprechenden Getter und Setter Methoden GetBASS_WINAMPVIS und SetBASS_WINAMPVIS.

Zitat:

Zitat von BassFan
3.Meine ausgabe funktion zur Anwendung war 'BASS_WINAMPVIS_GetAmpHwnd' Wie biege ich das nun so hin das sie wieder verwendbar ist ?

:wiejetzt:

Zitat:

Zitat von BassFan
Nachtrag: property wird doch nur abgearbeitet oder? Müßte das in meinen Fall nicht eine Function sein
da sie ja einen Rückgabe wert enthalten muss zur Hauptanwendung.

Siehe 2., wenn ich dich richtig verstanden hab.

BassFan 20. Jul 2006 22:34

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Zitat:

Beim Lesen der Eigenschaft wird die Methode GetAmpHwnd aufgerufen (funktion), beim Schreiben die Methode SetAmpHwnd. Es ist sinnvoll, zusätzlich eine private Variable zu deklarieren, in der die SetAmpHwnd einen Wert setzen kann. Diese Variable werden üblicherweisen mit einem F als Präfix definiert, also in deinem Fall FBASS_WINAMPVIS_GetAmpHwnd.

Wobei dein Name der Property BASS_WINAMPVIS_GetAmpHwnd äusserst schlecht gewählt ist... Ich würd eher einfach BASS_WINAMPVIS definieren, mit den entsprechenden Getter und Setter Methoden GetBASS_WINAMPVIS und SetBASS_WINAMPVIS.
Ja ist übersichtlicher.
Delphi-Quellcode:
  TAmpHwnd = class(TObject)
  private
    function GetBASS_WINAMPVIS: DWORD; stdcall;
    procedure SetBASS_WINAMPVIS(const Value: DWORD);
  public
    property BASS_WINAMPVIS : DWORD read GetBASS_WINAMPVIS write SetBASS_WINAMPVIS;
  end;

function TAmpHwnd.GetBASS_WINAMPVIS: DWORD; stdcall;

begin

end;

procedure TAmpHwnd.SetBASS_WINAMPVIS(const Value: DWORD);

begin

end;
Nach deiner beschreibung müßte ja der von mir hinzugefügte 'stdcall' dann richtig sein.
Könnte mir jemand mit dieser Type ein kleines Beispiel zeigen ?

Abhängig von 'AmpHandle := BASS_WINAMPVIS_GetAmpHwnd;' was ja nun nicht mehr gültig ist.
Noch eine Frage wie muss dann der Export aussehen ? War bisher BASS_WINAMPVIS_GetAmpHwnd

Wenn ich es einmal gesehen habe weiß ich in zukunft wie das mit GET/SET in Delphi funktioniert. :wink:

gruß

Jelly 20. Jul 2006 23:02

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Solange deine Getter- und Settermethode leer sind, wird da auch nix Prikelndes passieren, weder beim Auslesen von BASS_WINAMPVIS, noch beim Schreiben.

Wenn Du die Property allerdings wirklich nur zum Lesen und Schreiben eines Wertes nutzen willst, so kannst du auch gleich auf die Getter und Setter verzichten, und stattdessen auf ein privates Feld verweisen, etwas so:
Delphi-Quellcode:
type
  TAmpHwnd = class(TObject)
  private
    FBASS_WINAMPVIS: dword;
  public
      property BASS_WINAMPVIS : dword read FBASS_WINAMPVIS write FBASS_WINAMPVIS ;
  end ;
oder, weil ja eigentlich nix Spannendes passiert, einfach nur ein Feld im Public Teil deklarieren, und gut ist

Delphi-Quellcode:
type
  TAmpHwnd = class(TObject)
  public
      BASS_WINAMPVIS : dword ;
  end ;

BassFan 20. Jul 2006 23:20

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Zitat:

Solange deine Getter- und Settermethode leer sind, wird da auch nix Prikelndes passieren, weder beim Auslesen von BASS_WINAMPVIS, noch beim Schreiben.
Jo :oops: Deshalb hatte ich ja auch um ein kleines Beispiel gebeten
Bekomme wiedermal die Mitteilung trotz properties der linken seite kann nix zugewiesen werden. :(

Habe FGetBASS_WINAMPVIS Privat als TAmpHwnd definiert.
Delphi-Quellcode:
FGetBASS_WINAMPVIS : TAmpHwnd;
wollte es so übergeben.
Delphi-Quellcode:
FGetBASS_WINAMPVIS.SetBASS_WINAMPVIS(VisPlgHandle);
aber irgendwie kommt nichts richtig an. SCHÄM...
Und die Privaten Propertys kann ich nicht exportieren. Das muss ich aber da ich mich in einer DLL befinde.

gruß

Edit: In VB ist das so einfach. Da gibt es nix mit read/write innerhalb einer Property
Bnötigt keine Type oder sonst was, das ist alles.

Code:
Public Property Get FontSize() As Double

    FontSize = Songlist.Font.Size

End Property

Public Property Let FontSize(ByVal fsize As Double)

    Songlist.Font.Size = fsize
    Set Font = Songlist.Font

End Property

Jelly 21. Jul 2006 06:07

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Zitat:

Zitat von BassFan
wollte es so übergeben.
Delphi-Quellcode:
FGetBASS_WINAMPVIS.SetBASS_WINAMPVIS(VisPlgHandle);

:wall: Autsch
Also da sind aber nun etliche Fehler drin, in der Hinsicht warst Du jetzt sehr erfinderisch :-D
  • Was soll denn FGetBASS_WINAMPVIS sein
  • Falls FGetBASS_WINAMPVIS überhaupt irgendwas ist, dann ja wohl ein lokales Feld (Variable), und da willst Du eine Methode aufrufen... Das ist als ob du eine Variable i:integer irgendwo definierst, und dann so Sachen wie i.Seti auf rufst.

Wenn deine Property BASS_WINAMPVIS heisst, dann greif doch von aussen auch nur auf diese Propertty zu. Du hast doch ein Objekt von deiner Klasse instanziert, z.B.

Delphi-Quellcode:
winamp := TAmpHwnd.create ;
Willst Du von aussen was in die Property BASS_WINAMPVIS schreiben, so ruft du halt einfach:

Delphi-Quellcode:
winamp.BASS_WINAMPVIS := 123 ;
oder lesen, halt mit
Delphi-Quellcode:
showmessage (inttostr(winamp.BASS_WINAMPVIS)) ;
Dadurch wird intern die SetBASS_WINAMPVIS bzw. GetBASS_WINAMPVIS aufgerufen, falls denn definiert.

Und nochmal, Du wirst keine einzelnen Methoden oder Properties in einer DLL exportieren können, sondern nur global definierte Funktionen und Prozeduren, also alles Dinge die ausserhalb deiner Klasse definiert werden müssen.

Lies Dir wirklich mal ein Handbuch zu diesen ganzen Klassensachen durch, denn ich hab das Gefühl, da fehlt das Basisverständnis, was überhaupt im Hintergrund passiert.

BassFan 21. Jul 2006 10:19

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Zitat:

Lies Dir wirklich mal ein Handbuch zu diesen ganzen Klassensachen durch, denn ich hab das Gefühl, da fehlt das Basisverständnis, was überhaupt im Hintergrund passiert.
Ja es fehlt. Grundsätzlich bei Delphi
Kann auch nicht in einer Woche das wissen aneignen wo andere Jahre für gebraucht haben.

Schreibe im normalfall ja auch mit Vb.
Ich habe auch nichts erstellt wie winamp.create. Woher solle ich das auch wissen mit fast 0 Erfahrung unter Delphi
Deshalb bin ich hier :wink:

Die Hilfe in Delphi ist nicht gerade der beste wegbegleiter.
Gut danke für deine Hilfe werd mich da irgendwie durchbeißen, letztendlich ist es nur die DLL die ich fertigstellen möchte.

gruß

PS: Könnte es ja mit Copie/Past versuchen denke aber dies ist nicht der richtige weg.

BassFan 21. Jul 2006 20:01

Re: Probleme mit Threads und deren übergabe (wartezeit)
 
Hab jetzt alles versucht.
Das will nicht funktionieren.

Das Handle wird einfach nicht übergeben dann wenn ich es brauche.
Auch die Propertys ändern nichts da dran.
Seltsames verhalten :( was soll's

So kann ich den Quelltext nicht veröffentlichen.
Trotzdem Danke.

gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:51 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-2025 by Thomas Breitkreuz