![]() |
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:
Nach übergabe von CreateVis wird die function im Plugin nicht vollständig abgearbeitet
//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 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:
Sobald das Window erstellt wurde ist das amphandle bekannt
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; 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 |
Re: Bekomme die Krise
Moin da,
ändere bitte mal den Titel Deines Threads. Mit "Bekomme die Krise" kann keiner etwas anfangen. |
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 |
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:
Zitat:
Zitat:
Zitat:
Zitat:
![]() |
Re: Bekomme die Krise
Hi
Zitat:
Zitat:
Delphi-Quellcode:
Ohne diese schleife kann die Hauptanwendung das HWND nicht schnell genug in erfahrung bringen.
repeat
amphandle := BASS_WINAMPVIS_GetAmpHwnd; until amphandle <> 0; Zitat:
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:
Zitat:
über Property GET/LET übergeben und lesen können wäre mir schon geholfen. Kenne die Befehlsstruktur dafür in Delphi nicht. Zitat:
Möchte aber gerne lernen soweit ich konstuktive Informationen erhalte. Gruß |
Re: Bekomme die Krise
Zitat:
Hilft mir aber in keiner weise irgendwie weiter.. Also Dekonstruktiv Gruß |
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.
|
Re: Probleme mit Threads und deren übergabe (wartezeit)
Zitat:
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ß |
Re: Probleme mit Threads und deren übergabe (wartezeit)
Der Titel ist genehm, es war mein Fehler, hatte mich da vertan. :oops:
Zitat:
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. |
Re: Probleme mit Threads und deren übergabe (wartezeit)
Zitat:
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ß |
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:
Delphi-Quellcode:
type
TMyType = class(TObject) private function GetIrgendeineEingenschaft: TBeispiel; procedure SetIrgendeineEigenschaft(const Value: TBeispiel); public property IrgendEineEigenschaft : TBeispiel read GetIrgendeineEingenschaft write SetIrgendeineEigenschaft; end; |
Re: Probleme mit Threads und deren übergabe (wartezeit)
Auch Moin :-D
Zitat:
Delphi-Quellcode:
?
function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall;
begin //repeat Result := VisPlgHandle; //until VisPlgHandle <> 0 end; Zitat:
Bitte hier ist nochmal die ganze Routine welche das API-Fenster erstellt.
Delphi-Quellcode:
Habe es kommentiert damit man etwas besseren durchblick hat.
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; Gruß |
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:
Allerdings steht noch nichts in der Function und der Procedure da ich nicht sicher bin ob sie so richtig angewendet wurden.
function TAmpHwnd.GetAmpHwnd: DWORD; stdcall;
begin end; procedure TAmpHwnd.SetAmpHwnd(const Value: DWORD); begin end; 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ß |
Re: Probleme mit Threads und deren übergabe (wartezeit)
Zitat:
Zitat:
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:
|
Re: Probleme mit Threads und deren übergabe (wartezeit)
Zitat:
Delphi-Quellcode:
Nach deiner beschreibung müßte ja der von mir hinzugefügte 'stdcall' dann richtig sein.
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; 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ß |
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:
oder, weil ja eigentlich nix Spannendes passiert, einfach nur ein Feld im Public Teil deklarieren, und gut ist
type
TAmpHwnd = class(TObject) private FBASS_WINAMPVIS: dword; public property BASS_WINAMPVIS : dword read FBASS_WINAMPVIS write FBASS_WINAMPVIS ; end ;
Delphi-Quellcode:
type
TAmpHwnd = class(TObject) public BASS_WINAMPVIS : dword ; end ; |
Re: Probleme mit Threads und deren übergabe (wartezeit)
Zitat:
Bekomme wiedermal die Mitteilung trotz properties der linken seite kann nix zugewiesen werden. :( Habe FGetBASS_WINAMPVIS Privat als TAmpHwnd definiert.
Delphi-Quellcode:
wollte es so übergeben.
FGetBASS_WINAMPVIS : TAmpHwnd;
Delphi-Quellcode:
aber irgendwie kommt nichts richtig an. SCHÄM...
FGetBASS_WINAMPVIS.SetBASS_WINAMPVIS(VisPlgHandle);
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 |
Re: Probleme mit Threads und deren übergabe (wartezeit)
Zitat:
Also da sind aber nun etliche Fehler drin, in der Hinsicht warst Du jetzt sehr erfinderisch :-D
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:
Willst Du von aussen was in die Property BASS_WINAMPVIS schreiben, so ruft du halt einfach:
winamp := TAmpHwnd.create ;
Delphi-Quellcode:
oder lesen, halt mit
winamp.BASS_WINAMPVIS := 123 ;
Delphi-Quellcode:
Dadurch wird intern die SetBASS_WINAMPVIS bzw. GetBASS_WINAMPVIS aufgerufen, falls denn definiert.
showmessage (inttostr(winamp.BASS_WINAMPVIS)) ;
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. |
Re: Probleme mit Threads und deren übergabe (wartezeit)
Zitat:
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. |
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