Problem mit Threads
Hi,
Dieser Code funktioniert nicht: cthread := BeginThread(nil, 0, @OpenURL, PChar(urls[0]), 0, ThreadId); // urls = TDynStrArray Dieser Code funkioniert: cthread := BeginThread(nil, 0, @OpenURL, PChar('http://stream.clubnation.fm'), 0, ThreadId); In urls[0] steht http://stream.clubnation.fm. Warum funktioniert der zweite Code, aber der benötigte erste Code nicht ? In OpenURL werden die korrekten Parameter übergeben (http://stream.clubnation.fm). |
Re: Problem mit Threads
Was funktioniert nicht?
Wird der Thread nict erstellt? Die Prozedur nicht aufgerufen? |
Re: Problem mit Threads
Er meint, er könnte den Stream nicht abspielen, im anderen Fall spielt er ihn ab.
|
Re: Problem mit Threads
Was genau ist den "urls[0]"? Wirklich ein String? oder vielleicht doch ein Zeiger auf einen String? Typecasting mit PChar ist ein häufiger Stolperstein. Abhilfe: Du lagerst das Beginthread in eine Prozedur aus, die einen Parameter (nämlich die URL) enthält. diesen Parameter kannst Du dann in ein PChar casten, ohne Dir Sorgen zu machen.
Delphi-Quellcode:
Ich habe ein ähnliches Problem mit 'OutputDebugString' gehabt und mir dann so eine (ziemliche dumme) Hilfsroutine geschrieben.
Function StartPlayStream (anURL : String) : THandle;
Begin Result := BeginThread(nil, 0, @OpenURL, PChar(anURL), 0, ThreadId); // urls = TDynStrArray End; |
Re: Problem mit Threads
Urls ist ein Array of String.
Delphi-Quellcode:
function TfrmMain.StartPlayStream(anURL : String) : THandle;
var ThreadId : Cardinal; begin Result := BeginThread(nil, 0, @OpenURL, PChar(anURL), 0, ThreadId); // urls = TDynStrArray end; procedure TfrmMain.lvDblClick(Sender: TObject); var s : String; begin s := urls[0]; cthread := StartPlayStream(s); end; Zitat:
|
Re: Problem mit Threads
Zeig uns am Besten auch noch OpenURL. :)
Ich tippe mal auf ein "nil" als Parameter innerhalb der Funktion, da der String nur eine lokale Variable ist oder du das "stdcall" vergessen hast. :) Entweder eine globale Variable (naja, nicht wirklich eine Alternative, nur der Möglichkeit halben genannt) oder Speicher reservieren für PChar. :) |
Re: Problem mit Threads
Irgendwie scheint heute nicht mein Tag zu sein... Bittesehr:
Delphi-Quellcode:
function OpenURL(url: PChar) : Integer;
var icy: PChar; Len, Progress: DWORD; begin Result := 0; BASS_StreamFree(chan); // Alten Stream beenden progress := 0; SendMessage(win, WM_INFO_UPDATE, 0, 0); chan := BASS_StreamCreateURL(url, 0, BASS_STREAM_STATUS, @StatusProc, 0); if (chan = 0) then begin SendMessage(win, WM_INFO_UPDATE, 1, 0); // Fehler end else begin // Progress repeat len := BASS_StreamGetFilePosition(chan, BASS_FILEPOS_END); if (len = DW_Error) then Break; // Fehler progress := (BASS_StreamGetFilePosition(chan, BASS_FILEPOS_DOWNLOAD) - BASS_StreamGetFilePosition(chan, BASS_FILEPOS_CURRENT)) * 100 div len; // Buffer Prozent SendMessage(win, WM_INFO_UPDATE, 2, progress); until progress > 75; // Name + Bitrate icy := BASS_ChannelGetTags(chan, BASS_TAG_ICY); if (icy <> nil) then while (icy^ <> #0) do begin if (Copy(icy, 1, 9) = 'icy-name:') then SendMessage(win, WM_INFO_UPDATE, 3, DWORD(PChar(Copy(icy, 10, MaxInt)))) else if (Copy(icy, 1, 7) = 'icy-br:') then SendMessage(win, WM_INFO_UPDATE, 4, DWORD(PChar('bitrate: ' + Copy(icy, 8, MaxInt)))); icy := icy + Length(icy) + 1; end; // Stream-Titel + Sync setzen DoMeta(BASS_ChannelGetTags(chan, BASS_TAG_META)); BASS_ChannelSetSync(chan, BASS_SYNC_META, 0, @MetaSync, 0); // Abspielen BASS_ChannelPlay(chan, FALSE); end; cthread := 0; end; |
Re: Problem mit Threads
Bist du mal mit dem Debugger durchgegangen und hast die Variablen und Parameter geprüft?
|
Re: Problem mit Threads
ste_ett hat das Problem sauber diagnostiziert.
Es muss stdcall verwendet werden.
Delphi-Quellcode:
Warum hantierst du eigentlich mit dem Win32 Thread API statt TThread zu nutzen?
function OpenURL(url: PChar) : Integer; stdcall;
|
Re: Problem mit Threads
Der Channel steht aus irgendeinem Grund auf 0, aber ich sehe den Fehler nicht.
Mit oder ohne stdcall; kommt jetzt zusätzlich (kA, warum) das: --------------------------- Benachrichtigung über Debugger-Problem --------------------------- In Projekt ... trat ein Problem mit folgender Meldung auf: 'Privilegierte Instruktion bei 0x00af587d'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK --------------------------- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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