AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Debugger hält beim Programmende in CPU-Fenster
Thema durchsuchen
Ansicht
Themen-Optionen

Debugger hält beim Programmende in CPU-Fenster

Ein Thema von Codehunter · begonnen am 25. Nov 2019 · letzter Beitrag vom 16. Dez 2019
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 27. Nov 2019, 08:46
SynEdit hat da ein Problem, weil ich habe an einer Stelle in einer Anwendung SynEdit wegen eines Custom-SQL-Editors im Programm für unsere User. Rufe ich das nicht auf, schließt sich das Programm sauber, öffne ich das Fenster mit dem SynEdit Memo auch nur einmal, dann kriege ich beim Schließen der Anwendung einen Fehler im der was mit einem Interface in SynEdit zu tun hat.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 27. Nov 2019, 09:40
Das kann gut sein dass sich da gegenseitig was aufschaukelt. Denn den SynEdit in Verbindung mit dem SQL-Highlighter verwende ich auch.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 11:23
So, wo ich mal wieder Zeit hatte konnte ich das Problem reproduzieren und eingrenzen. Und zwar liegt es am VirtualBox Grafikkartentreiber. Wenn man in den VBox-Einstellungen die Grafikkarte auf VBoxSVGA stellt und den 3D-Support aktiviert, dann wirft SynEdit solche Exceptions. Das kann man mit einem Workaround beheben, indem man in der SynEdit.inc ganz am Ende den DirectWrite-Support auskommentiert:
Delphi-Quellcode:
// DirectWrite
{$IFDEF SYN_DELPHI_XE2_UP}
  //{$DEFINE SYN_DirectWrite}
{$ENDIF}
Dann noch das Synedit-Package neu erzeugen und fertig. Damit habe ich zwar die genaue Ursache noch nicht gefunden, aber zumindest gibts keine Exceptions mehr. Der Nachteil ist, dass Synedit dann wieder GDI zeichnet und entsprechend etwas langsamer ist.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 11:38
Das ist seltsam, weil ich nutze keine VM und habe das Problem, aber ich kann es mal probieren dieses WE.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 11:51
Das ist seltsam, weil ich nutze keine VM und habe das Problem, aber ich kann es mal probieren dieses WE.
Naja, das hat evtl. auch nur bedingt etwas mit der VM zu tun. Hier kann man den 3D-Support einfach ein- und ausschalten. Bei "echten" Grafikkarten ist der ja immer an. Möglicherweise fällt Windows automatisch auf GDI zurück, wenn man versucht auf einem Non-3D-System per DirectWrite zu zeichnen. Dann würde der Fehler nicht auftreten und demzufolge erklärt sich auch, warum bei mir keine Exceptions mehr kamen als ich auf VBoxVGA (nicht VBoxSVGA) ohne 3D umgeschaltet habe.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 12:11
Nachtrag: Ursache gefunden!

In der SynEdit.pas in der function TCustomSynEdit.CreateD2DCanvas folgende Zeile suchen:
Delphi-Quellcode:
    HR := D2DFactory.CreateHwndRenderTarget(D2D1RenderTargetProperties,
      D2D1HwndRenderTargetProperties(Handle, Size), FRenderTarget);
und wie folgt ergänzen:
Delphi-Quellcode:
    HR := D2DFactory.CreateHwndRenderTarget(D2D1RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_SOFTWARE),
      D2D1HwndRenderTargetProperties(Handle, Size), FRenderTarget);,
Das scheint also wirklich ein Treiberproblem zu sein. Denn laut MSDN heißt es
Zitat von MSDN:
The render target uses hardware rendering, if available; otherwise, it uses software rendering.
Wenn ich nun explizit D2D1_RENDER_TARGET_TYPE_HARDWARE angebe, bekomme ich genau die selben Exceptions. Erzwinge ich Software-Rendering (D2D1_RENDER_TARGET_TYPE_SOFTWARE), dann funktioniert es. Scheinbar melden manche Treiber inkorrekterweise, sie könnten D2D-Hardware-Rendering, obwohl es nicht stimmt. Dadurch erfolgt das notwendige Fallback auf Software-Rendering nicht. Dann kracht es irgendwo in der GPU, wo der Debugger nicht mit kommt und nur noch ratlos das CPU-Fenster anzeigt. So erkläre ich mir das jedenfalls. Vielleicht findet sich ja hier jemand, der das Ganze etwas besser erklären kann.

Noch ein Nachtrag: Ich denke ich habe die Erklärung gefunden. Vor langer Zeit wurde das in SynEdit implementiert. Damals gab es damals nur DirectX9. Irgendwann kam DX10 und wurde in der Winapi.D2D1.pas ergänzt. Nur wurde SynEdit nie daran angepasst. So wie es in SynEdit implementiert ist, fällt die Initialisierung auf DX9-Featurelevel zurück. Manche Graka-Treiber bieten aber nur DX10. Man kann DX10 erzwingen, wenn man die oben genannte Zeile wie folgt ändert:
Delphi-Quellcode:
HR := D2DFactory.CreateHwndRenderTarget(
  D2D1RenderTargetProperties(
    D2D1_RENDER_TARGET_TYPE_DEFAULT,
    D2D1PixelFormat(),
    0, 0,
    D2D1_RENDER_TARGET_USAGE_NONE,
    D2D1_FEATURE_LEVEL_10
  ),
  D2D1HwndRenderTargetProperties(Handle, Size), FRenderTarget
);
Entscheidend ist D2D1_FEATURE_LEVEL_10 anzugeben, wenn man ein DX10-System hat und D2D1_FEATURE_LEVEL_9 wenn man ein DX9-System hat. Jetzt habe ich aber spontan nichts gescheites gefunden, wie man die DirectX-Version ermitteln könnte. Außer in der Registry rumzustöbern.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (13. Dez 2019 um 12:49 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 14:54
Jetzt habe ich aber spontan nichts gescheites gefunden, wie man die DirectX-Version ermitteln könnte. Außer in der Registry rumzustöbern.
https://www.delphipraxis.net/179042-...t2d-1-1-a.html

D3D11CreateDevice -> Array mit gewünschten Feature Levels reingeben, das höchste unterstützte wird mit zurückgeben. Wenn größer gleich D3D_FEATURE_LEVEL_10_0, dann
kannst du von D2D1_FEATURE_LEVEL_10 ausgehen.

Beispiel:

Delphi-Quellcode:
function TDirectXBase.CreateD3DResources : Boolean;
var
  LD3DDevice : ID3D11Device;
  LCreationFlags : Cardinal;
  LD3DDeviceContext : ID3D11DeviceContext;
  LDriver : D3D_DRIVER_TYPE;
  SupportedFeatureLevel: D3D_FEATURE_LEVEL;
const
  FeatureLevels : array [0 .. 6] of D3D_FEATURE_LEVEL = (
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
    D3D_FEATURE_LEVEL_9_3,
    D3D_FEATURE_LEVEL_9_2,
    D3D_FEATURE_LEVEL_9_1);
  DriverTypes : set of D3D_DRIVER_TYPE = [D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP];
begin
  Result := False;
  LCreationFlags := LongWord(D3D11_CREATE_DEVICE_BGRA_SUPPORT);
  {$IFDEF DEBUG}
  LCreationFlags := LCreationFlags or LongWord(D3D11_CREATE_DEVICE_DEBUG);
  {$ENDIF}

  for LDriver in DriverTypes do
  begin
    Result := Succeeded(D3D11CreateDevice(nil, LDriver, 0, LCreationFlags, @FeatureLevels, Length(FeatureLevels), D3D11_SDK_VERSION, LD3DDevice, @SupportedFeatureLevel, LD3DDeviceContext));
    if Result then
      Break;
  end;

// hier dann was mit SupportedFeatureLevel machen

end;
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#18

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 20:08
Wie bekommen wir diese Verbesserungen in das offizielle SynEdit rein?
Damit alle profitieren und nicht jeder solche Fixes selber anbringen
muss!
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 13. Dez 2019, 21:00
Welches ist denn das "offizielle" SynEdit? Davon gibt es doch inzwischen so viele Forks... Die DirectDraw-Version konnte ich jetzt nicht mal in einem Repository finden. Wir haben diese Variante seit 2018 im Projekt. Die Probleme kamen in meinem Fall nach einem VBox-Update auf. Die Version die man aktuell bei Github findet, ist ein Fork vom einem Zweig, den ich selbst vor 7 Jahren bei Sourceforge gepflegt habe - wie man an der Signatur im Header erkennen kann. Die Variante mit DirectDraw ist auch ein Fork von "meinem" Zweig damals, jedoch nicht mit der Github-Version verwandt. Die Jungs bei Lazarus/LCL pflegen wiederum eine Variante, die noch vor meinem Zweig von der Urversion von Mael Hörz abgeleitet wurde. Alles sehr verworren mittlerweile.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#20

AW: Debugger hält beim Programmende in CPU-Fenster

  Alt 14. Dez 2019, 09:49
Welches ist denn das SynEdit Paket, das per GetIt installierbar ist?
Das würde ich wohl als das einigermaßen offizielle ansehen.

Es gibt diverse verweiste Sachen bei denen es schön wäre, wenn diese
weiter gepflegt würden. Nur wie bekommen wir sowas koordiniert hin
um es

a) überhaupt zu tun
b) Doppelarbeiten zu vermeiden?

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:42 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