Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit Threads (https://www.delphipraxis.net/85263-problem-mit-threads.html)

Nils_13 28. Jan 2007 10:50


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).

ste_ett 28. Jan 2007 11:11

Re: Problem mit Threads
 
Was funktioniert nicht?

Wird der Thread nict erstellt?
Die Prozedur nicht aufgerufen?

Nils_13 28. Jan 2007 11:24

Re: Problem mit Threads
 
Er meint, er könnte den Stream nicht abspielen, im anderen Fall spielt er ihn ab.

alzaimar 28. Jan 2007 11:44

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:
Function StartPlayStream (anURL : String) : THandle;
Begin
  Result := BeginThread(nil, 0, @OpenURL, PChar(anURL), 0, ThreadId); // urls = TDynStrArray
End;
Ich habe ein ähnliches Problem mit 'OutputDebugString' gehabt und mir dann so eine (ziemliche dumme) Hilfsroutine geschrieben.

Nils_13 28. Jan 2007 12:22

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:

---------------------------
Fehler
---------------------------
Can't play the stream

(error code: 0)
---------------------------
OK
---------------------------

ste_ett 28. Jan 2007 15:08

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. :)

Nils_13 28. Jan 2007 15:25

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;

ste_ett 28. Jan 2007 15:44

Re: Problem mit Threads
 
Bist du mal mit dem Debugger durchgegangen und hast die Variablen und Parameter geprüft?

Robert Marquardt 28. Jan 2007 15:54

Re: Problem mit Threads
 
ste_ett hat das Problem sauber diagnostiziert.
Es muss stdcall verwendet werden.
Delphi-Quellcode:
function OpenURL(url: PChar) : Integer; stdcall;
Warum hantierst du eigentlich mit dem Win32 Thread API statt TThread zu nutzen?

Nils_13 28. Jan 2007 16:01

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.
Seite 1 von 4  1 23     Letzte »    

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