AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Problem mit Threads
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Threads

Ein Thema von Nils_13 · begonnen am 28. Jan 2007 · letzter Beitrag vom 27. Apr 2007
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

Problem mit Threads

  Alt 28. Jan 2007, 10:50
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).
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#2

Re: Problem mit Threads

  Alt 28. Jan 2007, 11:11
Was funktioniert nicht?

Wird der Thread nict erstellt?
Die Prozedur nicht aufgerufen?
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#3

Re: Problem mit Threads

  Alt 28. Jan 2007, 11:24
Er meint, er könnte den Stream nicht abspielen, im anderen Fall spielt er ihn ab.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Problem mit Threads

  Alt 28. Jan 2007, 11:44
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#5

Re: Problem mit Threads

  Alt 28. Jan 2007, 12:22
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
---------------------------
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#6

Re: Problem mit Threads

  Alt 28. Jan 2007, 15:08
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.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#7

Re: Problem mit Threads

  Alt 28. Jan 2007, 15:25
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;
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#8

Re: Problem mit Threads

  Alt 28. Jan 2007, 15:44
Bist du mal mit dem Debugger durchgegangen und hast die Variablen und Parameter geprüft?
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Problem mit Threads

  Alt 28. Jan 2007, 15:54
ste_ett hat das Problem sauber diagnostiziert.
Es muss stdcall verwendet werden.
function OpenURL(url: PChar) : Integer; stdcall; Warum hantierst du eigentlich mit dem Win32 Thread API statt TThread zu nutzen?
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#10

Re: Problem mit Threads

  Alt 28. Jan 2007, 16:01
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
---------------------------
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 19:45 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