Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delay ja aber wie in DLL ? (https://www.delphipraxis.net/85534-delay-ja-aber-wie-dll.html)

EWeiss 1. Feb 2007 09:48


Delay ja aber wie in DLL ?
 
gibt es da ne unit die mit eingebunden werden muss ?
Application.ProzessMessages funktioniert ja nicht in der DLL

gruß

SirThornberry 1. Feb 2007 09:50

Re: Delay ja aber wie in DLL ?
 
Application.Processmessages funktioniert in einer DLL genau wie in einer EXE
Was bringt dich zu der Annahme/Aussage das es nicht funktioniert?

EWeiss 1. Feb 2007 09:57

Re: Delay ja aber wie in DLL ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von SirThornberry
Application.Processmessages funktioniert in einer DLL genau wie in einer EXE
Was bringt dich zu der Annahme/Aussage das es nicht funktioniert?

Weil es rot unterstrichen wird!

DelphiManiac 1. Feb 2007 10:02

Re: Delay ja aber wie in DLL ?
 
Hallo

Application.ProcessMessages überprüft ja die Message Pump ob neue Messages zu verarbeiten sind und arbeitet
diese dann ab. Die Funktion gehört zum Namensraum (oder hier in Delphi zur Unit) Forms.
Also muss diese auch in deiner DLL mit eingebunden werden, dann meckert der Compiler auch nicht mehr.
Gruß DelphiManiac

EWeiss 1. Feb 2007 10:05

Re: Delay ja aber wie in DLL ?
 
Zitat:

Zitat von DelphiManiac
Hallo

Application.ProcessMessages überprüft ja die Message Pump ob neue Messages zu verarbeiten sind und arbeitet
diese dann ab. Die Funktion gehört zum Namensraum (oder hier in Delphi zur Unit) Forms.
Also muss diese auch in deiner DLL mit eingebunden werden, dann meckert der Compiler auch nicht mehr.
Gruß DelphiManiac

Ja deshalb meine Frage! Habs mir schon gedacht.
Benötige aber keine Form ;)
Und das einbinden der 'Untit Froms' vergrößert die DLL um einiges.

Gibt es da ne andere möglichkeit ?

Luckie 1. Feb 2007 10:09

Re: Delay ja aber wie in DLL ?
 
Warum muss die DLL Nachrichten abarbeiten? Hat sie ein Fenster? Hier scheint mir ein Designfehler vorzuliegen. Erklär uns doch mal, was die DLL macht / machen soll.

DelphiManiac 1. Feb 2007 10:17

Re: Delay ja aber wie in DLL ?
 
Hi Luckie,

ich glaube hier geht es nicht darum, nur eine bestimmte Zeit zu warten.
Ohne Messages abzuarbeiten (sind ja auch keine da wenn er keine Form hat.

Wenn ich es richtig verstehe würde doch auch ein

Delphi-Quellcode:
Sleep(x);
reichen, oder?

marabu 1. Feb 2007 10:23

Re: Delay ja aber wie in DLL ?
 
Hallo,

Emil will wahrscheinlich gar keine Nachrichten in der DLL verarbeiten, sondern nur ein Delay einbauen - und dabei soll die Nachrichten-Warteschlange vom main thread weiter bedient werden. Das kann seine Tücken haben, aber eine solche Warteschleife ist natürlich auch ohne die Unit Forms möglich:

Delphi-Quellcode:
procedure Delay(ticks: Cardinal);
var
  Msg: TMsg;
  tc: Cardinal;
begin
  tc := GetTickCount;
  while (GetTickCount - tc) < ticks do
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;
Getippt und nicht getestet. So werden alle Nachrichten weiterverarbeitet - man könnte das einschränken. Wenn überhaupt keine Nachrichten verarbeitet werden sollen, dann kann man gleich Sleep() nehmen.

Freundliche Grüße

EWeiss 1. Feb 2007 10:43

Re: Delay ja aber wie in DLL ?
 
Es geht um meine BassVis!
@DelphiManiac
Nein ein Sleep geht nicht da diese den Thread einfriert.
@Luckie
Mein problem ist halt das aus irgendwelchen gründen die OpenGl Pugins nicht laufen.
Fenster werden initialisiert aber es findet keine Visualisierung statt.

Meine vermutung deshalb das die Threads in den OpenGL Plugins nicht beendet werden

Wenn ich nicht über die Winproc gehe dann funktionieren diese aber die Winamp5 Plugins nicht mehr.
Gehe ich über die Winproc dann wird nur das Fenster angezeigt findet aber keine Visualisierung statt
obwohl alle Module und Daten ohne Fehler aus dem Plugin ankommen.

Delphi-Quellcode:
  if (VisInfo^.Init) then

  begin

    VisWinCounter := VisCounter;
    Visinfo^.VisInfoCount := VisWinCounter;

    // Neuen Thread erstellen
    ThreadHandle := BeginThread(nil, 0, @WinampVisWin, VisInfo, 0, ThreadId);

    // DLL aus Speicher entfernen wenn ThreadHandle = 0
    if (ThreadHandle = 0) then
    begin
      FreeLibrary(VisDllHandle);
      FreeMem(VisInfo);

      BassFuncs^.SetError(BASS_ERROR_INIT);
      Exit;
    end;
    // Thread schließen
    CloseHandle(ThreadHandle);

//******************************************************
{
    //Open This for OpenGL it work
    //Only Winamp5 Plugins will not work when aktivate this
    //Einschalten um OpenGL Plugins zu testen
    //OpenGl geht mit Schließproblemen
    Repeat

    until DummyWindow <> 0;

    VisInfo^.WinHandle := DummyWindow;
    VisInfo^.VisModule^.Init(VisInfo^.VisModule);
}
//******************************************************
  end;
Wird der code in den kommentierten zeilen aktiviert dann funktioniert OpenGl.
Dazu muss aber in der Prozedure wo das DummyWindow erstellt wird

Delphi-Quellcode:
  //*********************************************
  // comment out for testing OpenGL
  //Ausschalten um OpenGL Plugins zu testen
  VisInfo^.WinHandle := DummyWindow;
  WinampVisExecute(Filename, Vismod, VismodCounter, VisInfo^.ParentHandle);

  WinampMenu := CreateMenu();
  PostMessage(DummyWindow, WM_INITWINAMP, 0, 0);

  sleep(25);
  // Bis hier Ausschalten
  //*********************************************

  while (GetMessage(Msg, 0, 0, 0)) do
diese zeilen bis GetMessage kommentiert(ausgeschaltet) werden.
Schlage mich mit dem Problem nun schon seit Monaten rum und finde keine vernünftige lösung
wie ich beides in einklang bringen kann.

Deshalb will ich jetzt mal mit Delay versuchen eine zwangspause einzulegen
die Threads dürfen dabei aber nicht unterbrochen werden.

EDIT:
Warum ich das vermute mit den threads der OpenGl Plugins
Wenn ich mit der Maus drüberfahre ist immer der Sanduhr Mauszeiger zu sehen.

gruss

EWeiss 1. Feb 2007 10:46

Re: Delay ja aber wie in DLL ?
 
Zitat:

Zitat von marabu
Hallo,

Emil will wahrscheinlich gar keine Nachrichten in der DLL verarbeiten, sondern nur ein Delay einbauen - und dabei soll die Nachrichten-Warteschlange vom main thread weiter bedient werden. Das kann seine Tücken haben, aber eine solche Warteschleife ist natürlich auch ohne die Unit Forms möglich:

Delphi-Quellcode:
procedure Delay(ticks: Cardinal);
var
  Msg: TMsg;
  tc: Cardinal;
begin
  tc := GetTickCount;
  while (GetTickCount - tc) < ticks do
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;
Getippt und nicht getestet. So werden alle Nachrichten weiterverarbeitet - man könnte das einschränken. Wenn überhaupt keine Nachrichten verarbeitet werden sollen, dann kann man gleich Sleep() nehmen.

Freundliche Grüße

JA genau! 100% erfasst.
Werde es damit mal versuchen.

Danke gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
Seite 1 von 2  1 2      

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