Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   [nonVCL] Screensaver mit Preview (Template) (https://www.delphipraxis.net/62013-%5Bnonvcl%5D-screensaver-mit-preview-template.html)

Sunlight7 25. Dez 2006 17:24

Re: [nonVCL] Screensaver mit Preview (Template)
 
Ja, die Regelmäßigen Serverabstürtze bringen mich auch etwas aus dem Konzept. :roteyes:
Oje, die Portalseite is grad kaputt :(


Ich weiß, ich war grad zu faul, den WM_MOUSEMOVE zu zerlegen :mrgreen:

So besser? :gruebel:

Delphi-Quellcode:
    WM_MOUSEMOVE:
      begin
        // Exit Screensaver on mouse move with a Workaround for the "Non-Kugel Mäuse Bug" :)
        if (ScreenMode = scrmStart) and (Counter >= 10) then begin
           If StartUpCursorPos.x+StartUpCursorPos.y=0 then begin
             StartUpCursorPos.x:=LOWORD(lParam);
             StartUpCursorPos.y:=HIWORD(lParam);
           end else begin
             CurrentPos.x:=LOWORD(lParam);
             CurrentPos.y:=HIWORD(lParam);
             If (CurrentPos.x-StartupCursorPos.x<-10) or
                (CurrentPos.x-StartupCursorPos.x> 10) or
                (CurrentPos.y-StartupCursorPos.y<-10) or
                (CurrentPos.y-StartupCursorPos.y> 10) then
                  PostMessage(hWnd, WM_CLOSE, 0, 0);
          end;
        end;
      end;

turboPASCAL 25. Dez 2006 18:57

Re: [nonVCL] Screensaver mit Preview (Template)
 
Aber sischa ! :mrgreen:

SnuffMaster23 8. Mai 2007 14:37

Re: [nonVCL] Screensaver mit Preview (Template)
 
Moin!
Wie stell denn ich das an dass ich ohne Timer dauerhaft rendern kann?
Also wie in Application.OnIdle?

Wenn ich das einfach in "Application.Run" reinschreib passiert nicht viel und wenn ich statt GetMessage PeekMessage nehm beendet er sich sofort wieder :?

teebee 8. Mai 2007 15:05

Re: [nonVCL] Screensaver mit Preview (Template)
 
Ich nehme abhängig vom Modus (Vorschau oder Schoner) zwei verschiedene Nachrichtenschleifen:

Delphi-Quellcode:
If (Mode<>mPreview) Then Begin // nur im Schonermodus mit voller Leistung
  While Not(Beenden) Do Begin
   While PeekMessage(Message,0,0,0,PM_REMOVE) Do Begin
    TranslateMessage(Message);
    DispatchMessage(Message);
   End;
   Render; // rendern, sobald alles andere abgearbeitet ist - "OnIdle"
  End;
 End
 Else Begin // Timer für Vorschaumodus
  Timer := SetTimer(hWnd,0,10,Nil);
  Try
   While GetMessage(Message,0,0,0) Do begin
    TranslateMessage(Message);
    DispatchMessage(Message);
   End;
  Finally
   KillTimer(hWnd,Timer);
  End;
 End;

...

//In WndProc:

WM_TIMER: Render; // Rendern bei "OnTimer"

WM_CLOSE: ...
          Beenden := True;
          ...
Gruß, teebee

SnuffMaster23 10. Mai 2007 15:25

Re: [nonVCL] Screensaver mit Preview (Template)
 
Yo, das sieht ja eigentlich nicht schlecht aus, hat aber die gleiche Macke wie mein erster Versuch mit PeekMessage:
Der Bildschirm wird schwarz, es wird nichts gerendert, meine Musik läuft weiter und nach einer Weile startet der Rechner neu als ob ich Reset gedrückt hätte.
Ich kann den Schoner nicht mehr beenden, noch nichtmal den Taskmanager aufrufen :!:

teebee 10. Mai 2007 21:02

Re: [nonVCL] Screensaver mit Preview (Template)
 
Ein Schoner, der genau diese Schleife verwendet, läuft seit einiger Zeit anstandslos auf diversen Rechnern.

Ich vermute das Problem eher in der Rendering-Funktion, die im "OnIdle"-Modus viel öfter aufgerufen wird als mit einem Timer.

In meiner Rendering-Funktion muss ich ganz zum Schluss, nach dem letzten BitBlt, noch ein GetPixel(hMem,0,0) als Dummy-Funktion ausführen, damit alles funktioniert. (hMem ist der Speicherkontext mit der Bitmap, auf die gerendert wird). Es soll ein Problem mit ATI-Treibern geben, was das erforderlich macht. Leider weiss ich nicht mehr, woher ich diese Information habe, ist schon eine Weile her. Finde jetzt auch gerade keine Quelle. Jedenfalls funktioniert es damit bei mir. Wenn mein Schoner im Timer-Modus läuft, geht es auch ohne das GetPixel.

turboPASCAL 11. Mai 2007 09:41

Re: [nonVCL] Screensaver mit Preview (Template)
 
Zitat:

Ich vermute das Problem eher in der Rendering-Funktion, die im "OnIdle"-Modus viel öfter aufgerufen wird als mit einem Timer.
Ja, das ist so.

Selbst in der VCL im "OnIdle" bekommt man leicht eine 98%-tige Systemauslastung hinn.

Lagere das Zeichnen doch in einen Thread aus wenn du keinen Timer willst. :gruebel:

SnuffMaster23 11. Mai 2007 13:21

Re: [nonVCL] Screensaver mit Preview (Template)
 
Ich hab nen ATi-Treiber, das werd ich demnächst ausprobieren, hab grad nur keine Zeit.
Wie krieg ich den Kontext der Bitmap? Das ist doch der Framebuffer der Grafikkarte :?
Redest du auch von OpenGL-Rendern? Nicht dass wir hier aneinander vorbeireden...

Der Rest der Renderroutine wirds kaum sein:
Delphi-Quellcode:
procedure Render;
var NowTime: Int64;
begin
    QueryPerformanceCounter(NowTime);
    TimePos := (NowTime - StartTime) / PerfFreq;

    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    glTranslatef(Tri(TimePos * SpeedX), Tri(TimePos * SpeedY), Tri(TimePos * SpeedZ));
    glCallList(List);
end;
In der Liste sind 6 Quadrate drin.

teebee 11. Mai 2007 19:51

Re: [nonVCL] Screensaver mit Preview (Template)
 
Zitat:

Zitat von SnuffMaster23
Redest du auch von OpenGL-Rendern? Nicht dass wir hier aneinander vorbeireden...

Nein, ich rendere mit dem GDI, dementsprechend handelt es sich bei mir um einen 'normalen' Speicherkontext mit Bitmap.
Ich benutze aber die PeekMessage-Schleife auch in einem nonVCL-OpenGL-Projekt, dort klappt es alles so wie es soll, Fenster oder Vollbild.
Funktioniert es denn, wenn Du mit dem Timer arbeitest?

Daniel Schuhmann 11. Mai 2007 20:11

Re: [nonVCL] Screensaver mit Preview (Template)
 
Eine Option, um das Ding multimonitorfähig zu machen, wär noch nicht schlecht :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.
Seite 3 von 4     123 4      

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