Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

Robert Marquardt 28. Jan 2007 16:23

Re: Problem mit Threads
 
Mitdenken. Ich wette mal StatusProc ist auch nicht als stdcall deklariert.

Nils_13 28. Jan 2007 16:46

Re: Problem mit Threads
 
Könnt ihr mir sagen, warum mir Delphi abschmiert, wenn ich stdcall; benutze ? Einmal neugestartet (RESTARTTASTE) und eben gerade noch so, mit dem ausnahmsweise nicht abgestürzten Taskmanager, gerettet.

Robert Marquardt 28. Jan 2007 17:26

Re: Problem mit Threads
 
Es koennte sein das die bass.dll cdecl statt stdcall will. Also StatusProc mal probeweise mit cdecl statt stdcall deklarieren.

Nils_13 28. Jan 2007 17:34

Re: Problem mit Threads
 
Hmm...ich habe gerade herausgefunden, dass OpenURL Delphi aufhängt, wenn dort ein stdcall; steht, bei cdecl; passiert hingegen überhaupt nichts. StatusProc funktioniert mit stdcall.

ste_ett 28. Jan 2007 17:41

Re: Problem mit Threads
 
Hast du Speicher reserviert für den Parameter?
Sonst ist es klar, dass es knallt. :)

Delphi-Quellcode:
procedure TfrmMain.lvDblClick(Sender: TObject);
var
  p: PChar;
begin
  GetMem(p, Length(urls[0]) +1); // Speicher reservieren, da eine lokale Variable nach Durchlauf der Funktion/Prozedur nicht mehr besteht
  StrPCopy(p, urls[0]);
  cthread := StartPlayStream(p);
end;



function OpenURL(url: PChar) : Integer;
var
  icy: PChar;
  Len, Progress: DWORD;
begin
  Result := 0;

// restlicher Code hier...

  FreeMem(url); // Speicher wieder freigeben
end;

Robert Marquardt 28. Jan 2007 17:44

Re: Problem mit Threads
 
Das verwundert mich jetzt aber sehr. Ich habe nochmal bei meinem D6 nachgeschaut und TThreadFunc sollte weder stdcall noch cdecl haben.
Ich habe nicht realisiert das BeginThread ja eine Delphifunktion ist und keine Win32-Funktion.

Robert Marquardt 28. Jan 2007 17:48

Re: Problem mit Threads
 
ste_ett, wenn man den Speicher alloziiert, dann sollte man ihn auch wieder freigeben. p als lokale Variable ist also schlecht.

ste_ett 28. Jan 2007 17:51

Re: Problem mit Threads
 
Zitat:

Zitat von Robert Marquardt
Das verwundert mich jetzt aber sehr. Ich habe nochmal bei meinem D6 nachgeschaut und TThreadFunc sollte weder stdcall noch cdecl haben.
Ich habe nicht realisiert das BeginThread ja eine Delphifunktion ist und keine Win32-Funktion.

BeginThread ruft intern aber auch nur CreateThread auf und der Parameter wird indirekt weitergegeben. :)

Als Parameter wird ThreadProc erwartet oder NULL, wenn keine Parameter übergeben wwerden sollen.

Code:
HANDLE WINAPI CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);

DWORD WINAPI ThreadProc(
  LPVOID lpParameter
);
WINAPI ist als __stdcall definiert.

ste_ett 28. Jan 2007 17:55

Re: Problem mit Threads
 
Zitat:

Zitat von Robert Marquardt
ste_ett, wenn man den Speicher alloziiert, dann sollte man ihn auch wieder freigeben. p als lokale Variable ist also schlecht.

s. letzte Zeile in OpenURL(). :)
Die Speicheradresse hat man über den Parameter der Funktion, von da her ist es über eine lokale Variable möglich, da der Ort, auf den der Zeiger zeigt, nicht verloren geht.

Nils_13 28. Jan 2007 17:56

Re: Problem mit Threads
 
Ich habe deinen Code instgesamt 3x angwendet (also ausgeführt):
1: Ungültige Zeigeroperation, wegklickbar, kein Absturz
2: Ungültige Zeigeroperation, wegklickbar, Absturz
3: Ungültige Zeigeroperation, wegklickbar, Absturz


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 Uhr.
Seite 2 von 4     12 34      

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