![]() |
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ß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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