Autor Téma: Delphi 6 kreslení na Paintbox canvas pod Windows 10  (Přečteno 650 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Vážená komunito,

narazil jsem na podivný problém s kreslením na Canvas objektu Paintbox pod Windows 10. Windows XP, 7 a 8 funguje bez problému. Pod Windows 10 dochází k "přerušení" kreslení a následnému vymazání Canvasu. Toto přerušení je vždy po cca 6 sekundách.

Jelikož je kód rozsáhlý a dávat sem útržky by mohlo mást, popíši princip kreslení a výsledky mých testů. Aplikace je vytvořená v Delphi 6.

Princip kreslení:
1. V textovém souboru jsou souřadnice (data). Tento soubor se načte a v cyklu "while not Eof(soubor) do" se prochází řádek jeden po druhém (celkem jich je cca 100000).
2. Kreslení je na Canvas objektu typu Paintbox. Kreslí se jen pomocí MoveTo a LineTo. Na začátku kreslící procedury a na jejím konci je handle Canvasu totožný.
3. Nakonec se soubor zavře

Poznatky:
1. Kreslí se mimo OnPaint objektu Paintbox.
2. Když si vytvořím novou aplikaci a kreslím fragmenty jen podle nějakého algoritmu, tak k přerušení kreslení nedochází (ale neotevírá se soubor s daty).
3. Čas je vždy stejný, tj. cca 6 sekund. Když je dat v souboru méně a vše se stihne do těch cca 6 sekund, tak je kreslení v pořádku.
4. cykl "while not" pro čtení řádků vždy přečte všechny řádky, tj. kreslení není přerušené, jen se nekreslí na Canvas, ale kód se dokončí v pořádku.

Jsem z toho zmatený. Poslední bod z poznatků mi ukázal, že kreslící kód v pořádku doběhne. Jakoby se ale ztratila informace, na co má kreslit. Handle Canvasu je ale správný i na konci. Navíc se to děje jen na Windows 10. Napadlo mě, že by to mohlo mít společné s tím, že kreslení je voláno mimo OnPaint (u VCL to nikdy nevadilo, ale možná Windows 10 mají něco jinak).

Napadá někoho nějaká rada?
Děkuji za pomoc.



Online pf1957

  • Padawan
  • ******
  • Příspěvků: 3292
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #1 kdy: 09-08-2021, 14:18:18 »
Napadlo mě, že by to mohlo mít společné s tím, že kreslení je voláno mimo OnPaint
No to te napadlo spravne, protoze na canvas bys mel psat jen v kontextu obsluhy zpravy WM_PAINT, kdyz te k tomu Windows vyzvou -> v Delphi je to v handleru OnPaint. Navic, TPaintBox nema vlastni canvas a zobrazuje se v canvasu widgetu, ktery ma windows handle = vlastni canvas.
Citace
(u VCL to nikdy nevadilo, ale možná Windows 10 mají něco jinak).
Nejspis jen vyplula na povrch nejaka race condition error.


Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #2 kdy: 09-08-2021, 14:38:38 »
Tak jsem vyzkoušel kreslit vše přes OnPaint event objektu Paintbox a stejný výsledek. Pokud je kreslení delší jak cca 6 sekund tak bude prázdný Canvas. Asi už jsem to zkoušel dříve, ale začíná se mi to vše motat. Je to prostě záhada, že totožný kód zlobí jen na Windows 10 (zkoušeno na 3 různých počítačích).

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #3 kdy: 09-08-2021, 15:18:53 »
Jinak někdy dříve jsem četl, že Windows 10 mění "princip práce" s 2D grafikou. Je to vidět například u Paintboxu. U Win XP a 7, když na Canvas Paintboxu něco nakreslím a poté přes to přesunu jiné okno, tak se nakreslené části přemažou. Toto u Windows 10 (a asi i u Windows 8 ) neplatí. Zde se to chová jako TImage.   

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1274
  • Karma: 51
    • Verze Delphi: 10.3
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #4 kdy: 09-08-2021, 19:05:25 »
No a není lepší to vykreslit do tBitmap a pak jen bleskově do paintboxu v OnPaint? (Nebo to dát do tImage.)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #5 kdy: 10-08-2021, 07:48:31 »
Tak způsobů je několik. Rád bych ale přišel na to, proč se chyba objevuje jen u Windows 10 a né u 8 a starší. Na co si dát v kódu pozor a tak. Ten je sice obsáhlý, protože obsahuje různýž parsing, matiku a tak, ale jinak nic neobvyklého.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #6 kdy: 11-08-2021, 12:22:35 »
Tak mám zajímavou novinku! Když se aplikace spustí s režimem kompatibility pro Windows 7, tak kreslení vždy dopadne dobře, i když trvá déle než těch cca 6 sekund. Vypadá to, že je ve Windows 10 něco špatně a "kecá" to do kreslení na Canvas objektu Paintbox.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 3292
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #7 kdy: 11-08-2021, 13:15:28 »
Excellent
Rated 2 times
Windows 10 něco špatně a "kecá" to do kreslení na Canvas objektu Paintbox.
Pokud kreslis spravne v kontextu, ktery paint box dostal jako parametr zpravy WM_PAINT tj. ve virtualni metode Paint resp. v handleru OnPaint, tak se podivej jeste na Windows Ghosting, kdy si wokna hlidaji, jestli tvoje aplikace obsluhuje pumpu zprav a maji tam time-out. Muzes to zkusit vypnout volanim DisableProcessWindowsHosting, co se stane.

Ale v kazdem pripade ta aplikace neni spravne navrzena, pokud z hlavniho threadu kresli = obsluhuje jednu zpravu z fronty tak dlouho.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #8 kdy: 11-08-2021, 14:08:33 »
Excellent
Rated 1 time
Klaním se až k zemi a děkuji. Po vypnutí Windows Ghosting to již kreslí správně. Zaimplementuji to do kódu a půjdu slavit. Může vypnutí této funkce způsobit nějaké jiné problémy? Je potřeba si na něco dát pozor?

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 3292
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Delphi 6 kreslení na Paintbox canvas pod Windows 10
« Odpověď #9 kdy: 11-08-2021, 14:32:43 »
Klaním se až k zemi a děkuji. Po vypnutí Windows Ghosting to již kreslí správně. Zaimplementuji to do kódu a půjdu slavit. Může vypnutí této funkce způsobit nějaké jiné problémy? Je potřeba si na něco dát pozor?
AFAIK, tak je to jen ochrana proti zatuhnuti, ktera se nekdy do woken pridavala viz https://docs.microsoft.com/en-us/windows/win32/win7appqual/preventing-hangs-in-windows-applications?redirectedfrom=MSDN