AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Probleme mit Threads und deren übergabe (wartezeit)
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Threads und deren übergabe (wartezeit)

Ein Thema von BassFan · begonnen am 20. Jul 2006 · letzter Beitrag vom 21. Jul 2006
Antwort Antwort
Seite 2 von 2     12   
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#11

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

  Alt 20. Jul 2006, 21:32
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 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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
BassFan
(Gast)

n/a Beiträge
 
#12

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

  Alt 20. Jul 2006, 21:51
Auch Moin

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ß
  Mit Zitat antworten Zitat
BassFan
(Gast)

n/a Beiträge
 
#13

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

  Alt 20. Jul 2006, 22:59
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#14

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

  Alt 20. Jul 2006, 23:14
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 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 von BassFan:
3.Meine ausgabe funktion zur Anwendung war 'BASS_WINAMPVIS_GetAmpHwnd' Wie biege ich das nun so hin das sie wieder verwendbar ist ?


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.
  Mit Zitat antworten Zitat
BassFan
(Gast)

n/a Beiträge
 
#15

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

  Alt 20. Jul 2006, 23:34
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.

gruß
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#16

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

  Alt 21. Jul 2006, 00:02
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 ;
  Mit Zitat antworten Zitat
BassFan
(Gast)

n/a Beiträge
 
#17

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

  Alt 21. Jul 2006, 00:20
Zitat:
Solange deine Getter- und Settermethode leer sind, wird da auch nix Prikelndes passieren, weder beim Auslesen von BASS_WINAMPVIS, noch beim Schreiben.
Jo 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.
FGetBASS_WINAMPVIS : TAmpHwnd; wollte es so übergeben.
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#18

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

  Alt 21. Jul 2006, 07:07
Zitat von BassFan:
wollte es so übergeben.
FGetBASS_WINAMPVIS.SetBASS_WINAMPVIS(VisPlgHandle);
Autsch
Also da sind aber nun etliche Fehler drin, in der Hinsicht warst Du jetzt sehr erfinderisch
  • 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.

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

winamp.BASS_WINAMPVIS := 123 ; oder lesen, halt mit
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.
  Mit Zitat antworten Zitat
BassFan
(Gast)

n/a Beiträge
 
#19

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

  Alt 21. Jul 2006, 11:19
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

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.
  Mit Zitat antworten Zitat
BassFan
(Gast)

n/a Beiträge
 
#20

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

  Alt 21. Jul 2006, 21:01
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ß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 17:09 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