Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 19:10

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: process.h in Pascal
BeitragVerfasst: Sa Jul 20, 2013 14:33 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Hi,

in der sdl_thread.h steht, in einem fetten IFDEF WIN32:

Code:
  1.  
  2. #define SDL_PASSED_BEGINTHREAD_ENDTHREAD
  3. #include <process.h>            /* This has _beginthread() and _endthread() defined! */
  4.  
  5. typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
  6.                                                         unsigned (__stdcall *
  7.                                                                   func) (void
  8.                                                                          *),
  9.                                                         void *arg, unsigned,
  10.                                                         unsigned *threadID);
  11. typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
  12.  
  13. /**
  14.  *  Create a thread.
  15.  */
  16. extern DECLSPEC SDL_Thread *SDLCALL
  17. SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data,
  18.                  pfnSDL_CurrentBeginThread pfnBeginThread,
  19.                  pfnSDL_CurrentEndThread pfnEndThread);
  20.  
  21. /**
  22.  *  Create a thread.
  23.  */
  24. #define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, _beginthreadex, _endthreadex)
  25.  


Für nicht Win32 ist SDL_CreateThread dagegen einfach folgendermaßen deklariert:

Code:
  1.  
  2. extern DECLSPEC SDL_Thread *SDLCALL
  3. SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data);
  4.  


Wenn ich es aber so übersetze und unter Windows aufrufen kriege ich eine Access-Violation, also muss ich wohl den oberen Abschnitt für Win32 übersetzen - nur wie soll ich den Teil aus der process.h übersetzen (begin/endthread)?

MfG

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Sa Jul 20, 2013 15:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde den Thread-Teil aus SDL gezielt nicht portieren, da dieser in der FreePascal und der Delphi Standardbibliothek schon gut implementiert ist (TThread). Wenn du es doch auf jeden fall portieren möchtest, würde ich TThread zu grunde legen. Das spart dir den plattformabhängigen Teil.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Sa Jul 20, 2013 16:41 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Ich muss es übersetzen, weil das Audiosystem darauf zurückgreift. Ich wundere mich trotzdem, weil die Header-Datei seit SDL 1.2 genauso besteht und ich im Endeffekt die SDL 1.2 Header kopiert habe...

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: So Jul 21, 2013 23:31 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
siehe WinAPI Dokumentation für BeginThread EndThread

Das ist auch das, was TThread dann am Ende kapselt.....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Mo Jul 22, 2013 07:58 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Ja...ich bin so ein Troll, ist mir heute morgen beim Zähneputzn auch aufgefallen... ^^

Danke natürlich für die Hilfe!

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Mo Jul 22, 2013 18:15 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Ich hab immer noch die Zugriffsverletzung bekommen. Allerdings funktionierte es tadellos, wenn ich es 64-Bit kompilieren ließ. Also stimmt irgendwas mit den Pointergrößen nicht...

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Di Jul 23, 2013 02:59 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
gut möglich :)


Benutzt Du auch die richtige calling convention?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Di Jul 23, 2013 08:07 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Hab bis jetzt immer cdecl genommen und hat bis jetzt immer tadellos funktioniert

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Di Jul 23, 2013 15:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
das winapi ist aber zu 99% stdcall;

Falls das hilft; wenn der call in eine c dll reingeht, dann eher nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Di Jul 23, 2013 16:05 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Ich übersetze ja nur SDL => nur C => sollte kein STDCALL sein. Es funzt ja mit CDECL aber leider nur unter WIN64.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Mi Jul 24, 2013 21:37 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
ah stimmt ja. Dann bügle doch den SDL_CreateThread auf dein eigenen code um, wenn Du unter Win32 bist.

SDL war noch nie meins :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Sa Jul 27, 2013 14:46 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Hab gerade bemerkt, dass ich das Problem erweitern muss:

Fast überall wo Pointer benutzt werden kriege ich unter Win32 ne Accessviolation. Und zwar, wenn ich einer Methode als Parameter einen Pointer übergeben.

Funktionen, die Pointer zurückgeben, geben diese allerdings korrekt zurück.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Sa Jul 27, 2013 17:05 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Größenproblem der Pointer?
Klingt so als wären deine zu klein. Aber sowas sollte eigentlich nicht passieren oO
Gib mal den Original- und deinen Code an einer dieser Stellen zum Vergleich.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: Sa Jul 27, 2013 18:16 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Das Programm:

Code:
  1.  
  2. var
  3.   thread: PSDL_Thread;
  4.   i: Integer;
  5.  
  6. function MyThread1(data: Pointer): Integer;
  7. begin
  8.   SDL_Delay(1000);
  9.   WriteLn('Hallo 1');
  10.   Result := 1;
  11. end;
  12.  
  13. begin
  14.     thread := SDL_CreateThread(@MyThread1,PAnsiChar('Thread 1'), nil);
  15.     ReadLn;
  16.     i := 0;
  17.     SDL_WaitThread(thread,@i);
  18.     WriteLn(IntToStr(i));
  19.     ReadLn;
  20.   end;
  21.  


Funktioniert unter Win64 tadellos. Unter Win32 wirft es die AccessViolation bei SDL_CreateThread.

Übrigens unabhängig vom Compiler.

Übersetzung der Funktion:

Code:
  1.   
  2. PSDL_ThreadFunction = ^TSDL_ThreadFunction;
  3. TSDL_ThreadFunction = function(data: Pointer): Integer;
  4.  
  5. function SDL_CreateThread(fn: TSDL_ThreadFunction; name: PAnsiChar; data: Pointer): PSDL_Thread cdecl; external {$IFDEF GPC} name 'SDL_CreateThread' {$ELSE} SDL_LibName {$ENDIF};
  6.  
  7.  


Originalcode:

Code:
  1.  
  2. typedef int (SDLCALL * SDL_ThreadFunction) (void *data);
  3.  
  4. extern DECLSPEC SDL_Thread *SDLCALL
  5. SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data);
  6.  
  7.  


MfG

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: process.h in Pascal
BeitragVerfasst: So Jul 28, 2013 00:44 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Muss die Threadfunction auch 'ne bestimmte CallingConvention haben, wenn der caller cdecl ist? Wenn man alles weglässt ists ja register;

register und cdecl mögen sich nicht. fastcall und cdecl sind ähnlich, da wird von rechts nach links auf den stack geschoben, wobei bei fastcall erst versucht wird register zu benützen...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]