AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Init, Timer läuft nicht an

Ein Thema von schwa226 · begonnen am 12. Apr 2010 · letzter Beitrag vom 27. Apr 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

Re: DLL Init, Timer läuft nicht an

  Alt 12. Apr 2010, 22:36
Der Timer funktioniert nur mit Nachrichtenschleife. Diese wird unter anderem ausgeführt bei einem YourForm.ShowModal. Damit der Timer wie gewünscht funktioniert brauchst du also eine Nachrichtenschleife.
Himitsus Vorschlag verstehe ich wie folgt. Erstelle im C-Programm einen Thread. Dieser Thread startet/lädt die Dll und innerhalb der DLL lässt du dann auch die Nachrichtenschleife laufen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#12

Re: DLL Init, Timer läuft nicht an

  Alt 12. Apr 2010, 22:43
Zitat von schwa226:
Also beim laden der DLL einen Thread erzeugen, der dann die Form erzeugt?
jupp


Wenn die DLL geladen/initialisiert wird, innerhalb der DLL einen Thread erzeugen,
darin die Form erstellen und dann einfach ein

(im Thread.Execute)
Delphi-Quellcode:
MyForm := TMyForm.Create(nil);
try
  while not Terminated do //while aktiv{oder "not Beenden"} do
  begin
    Application.ProcessMessages;
    Sleep(10);
  end;
finally
  MyForm.Free;
end;
Und nicht vergessen Zugriffe auf diese VCL unbedingt mit diesem Thread zu syncronisieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

Re: DLL Init, Timer läuft nicht an

  Alt 12. Apr 2010, 22:52
Ich glaube so wird das nicht funktionieren. Wie du bereits angemerkt hast ist die VCL nicht Threadsave. Und das heißt konkret das die VCL (Application.ProcessMessage etc.) nur ordentlich arbeitet wenn es in dem Thread arbeitet in dem das Modul geladen wurde. Der Thread muss also außerhalb der DLL erstellt werden so dass, das Application-Object und die Initialization-Abschnitte innerhalb der DLL bereits in diesem Thread ausgeführt werden (oder mit anderen Worten: Die DLL darf muss "denken" das sie im einzigen Thread läuft)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#14

Re: DLL Init, Timer läuft nicht an

  Alt 12. Apr 2010, 23:18
Es geht!

Delphi-Quellcode:
procedure TMainThread.Execute;
begin
  try
    //plugin gets loaded, create Form
    if Not Assigned(frMain) then
      frMain := TfrMain.Create(NIL);

    //start startupdelay
    frMain.StartStartUpDelay(StartDelay);

  while not Terminated do //while aktiv{oder "not Beenden"} do
  begin
    if frMain.StartUpDelay.Enabled then
      Application.ProcessMessages;
    Sleep(1); //fix 100% cpu bug
  end;
  finally
    if Assigned(frMain) then
      FreeAndNil(frMain);
  end;
end;
Das ProcessMessages lasse ich aber nach dem Startup Delay wieder aus.

Danke!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: DLL Init, Timer läuft nicht an

  Alt 12. Apr 2010, 23:19
Das ganze Gekrampfe spart man sich, wenn man einfach per Hand einen Timer anfordert, und darin die Option eines Callbacks nutzt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#16

Re: DLL Init, Timer läuft nicht an

  Alt 13. Apr 2010, 19:24
SetTimer geht bei mir nicht, da ich ja die WM_TIMER nicht bekomme....

Habe jetzt noch ein Problem!
Der Timer wird nun ausgelöst, aber wenn ich die Form einmal gezeigt hatte mit ShowModal dann gibt es den Error: 5 ' Zugriff verweigert' wenn ich ein FreeAndNil(frMain) mache:

Delphi-Quellcode:
procedure TmyThread.Terminate;
begin
  inherited Terminate;
  PostMessage(FHWND, WM_QUIT , 0,0);
end;

procedure TmyThread.Execute;
var msg:Tmsg;
begin

try
  //plugin gets loaded, create Form
  if Not Assigned(frMain) then
    frMain := TfrMain.Create(NIL);

  frMain.AddLog('plugin got init');

finally
//todo
end;

  FHWND:=allocatehwnd(WndProc); //hier ist jetzt dein Windowhandle für MMAudio
  try
    //[weitere Initialisierungen]
    while getMessage(msg,0,0,0) do //warten auf Message
      DispatchMessage(msg); //verteilen auf das entsprechende Fenster (gibt hier allerdings eh nur eins)
  finally
    if Assigned(frMain) then
      FreeAndNil(frMain);
   Deallocatehwnd(FHWND);
  end;
end;

procedure TmyThread.wndProc(var Msg:TMessage);
begin
  Dispatch(msg); //verteilen auf die Methoden mit der entsprechenden Message -->MMInDone
end;
Callstack:
Zitat:
:75e69617 KERNELBASE.RaiseException + 0x54
:0046a4ed RaiseLastOSError + $75
:0046a476 RaiseLastOSError + $A
:004ec618 TCustomForm.DestroyWindowHandle + $38
:00454fc3 TObject.Free + $B
:00454fc3 TObject.Free + $B
:0048fb85 ThreadProc + $45
:0045626e ThreadWrapper + $2A
:772a1174 kernel32.BaseThreadInitThunk + 0x12
:77bcb3f5 ntdll.RtlInitializeExceptionChain + 0x63
:77bcb3c8 ntdll.RtlInitializeExceptionChain + 0x36
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#17

Re: DLL Init, Timer läuft nicht an

  Alt 13. Apr 2010, 19:27
Zitat von schwa226:
SetTimer geht bei mir nicht, da ich ja die WM_TIMER nicht bekomme....
Und jetzt rate mal, was der TTimer intern kapselt?

Genau: SetTimer+WM_TIMER
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#18

Re: DLL Init, Timer läuft nicht an

  Alt 13. Apr 2010, 19:46
Das habe ich schon kapiert,

jedoch behebt das mir leider nicht den Fehler wenn ich die Form anzeige.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#19

Re: DLL Init, Timer läuft nicht an

  Alt 13. Apr 2010, 22:34
Zitat:
Und nicht vergessen Zugriffe auf diese VCL unbedingt mit diesem Thread zu syncronisieren.
Danke himitsu

Habe im DLL Aufruf direkt auf die Form zugegriffen und das Showmodal ausgeführt.

Sende nun mit PostThreadMessage eine Nachricht und der Thread führt dann das Showmodal aus.
Dann gibt es keine Fehlermeldung mehr!

Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#20

Re: DLL Init, Timer läuft nicht an

  Alt 13. Apr 2010, 23:46
Zitat von schwa226:
SetTimer geht bei mir nicht, da ich ja die WM_TIMER nicht bekomme....
Das Message-Problem ist mir schon bewusst gewesen. Lies dir die Doku noch mal ganz genau durch Evtl. unter Zuhilfenahme dessen, was ich in meinem Posting geschrieben hab.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  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 05:29 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