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 3 von 3     123   
schwa226

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

Re: DLL Init, Timer läuft nicht an

  Alt 14. Apr 2010, 16:27
Werd's mir nocheinmal genauer ansehen!

Aber zuerst habe ich noch eine Frage zu dem ShowModal:

Ich sende ja nun den Thread, dass er die Form anzeigen soll. somit wird der DLL aufruf ja sofort wieder beendet, da ja nur PostThreadMessage gemacht wird.

Somit ist es nicht Modal. Wie kann man das noch am besten machen, dass die DLL im ShowSettings stehen bleibt?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: DLL Init, Timer läuft nicht an

  Alt 14. Apr 2010, 16:33
Du könntest TThread.Syncronize in der DLL nutzen, um mit dem Thread zu synchronisieren.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
schwa226

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

Re: DLL Init, Timer läuft nicht an

  Alt 15. Apr 2010, 16:55
Hab's mit Synchronize versucht, da kommt wieder der Zugriff-Verweigert Fehler:

Delphi-Quellcode:
MyMainThread : TMyMainThread;

procedure ShowSettings(Handle: Integer);
begin
  if Assigned(MyMainThread) then
    MyMainThread.Synchronize(MyMainThread, MyMainThread.ShowDLLForm);
  
// PostThreadMessage(MyMainThread.ThreadID, WM_SHOWFORM, Handle, 0);
end;

procedure TMyMainThread.ShowDLLForm;
begin
  if Assigned(frMain) then
    frMain.ShowModal;
end;
EDIT:
Auch habe ich noch eine anderes Problem:
Ich starte ja nun einen Thread, dieser macht mir die frMain Form.
Nun arbeite ich mit einem HID-Deivce.
Wenn nun das Gerät abgesteckt wird bleibt mir die DLL bei Checkin stehen:
Delphi-Quellcode:
// method CheckIn hands a checked out HidDevice back in

procedure TJvHidDeviceController.CheckIn(var HidDev: TJvHidDevice);
begin
  if HidDev <> nil then
  begin
    HidDev.StopThread; //<----- hier bleibt es stehen
    HidDev.CloseFile;
    HidDev.CloseFileEx(omhRead);
    HidDev.CloseFileEx(omhWrite);

    if HidDev.IsPluggedIn then
    begin
      HidDev.FIsCheckedOut := False;
      Dec(FNumCheckedOutDevices);
      Inc(FNumCheckedInDevices);
    end
    else
      HidDev.Free;
    HidDev := nil;
  end;
end;
Delphi-Quellcode:
procedure TJvHidDevice.StopThread;
begin
  if Assigned(FDataThread) then
  begin
    FDataThread.Terminate;
    FDataThread.WaitFor; <<----schätze also hier das es stehen bleibt
    FDataThread.Free;
    FDataThread := nil;
  end;
end;
Wenn ich die EXE beende, die die DLL geladen hatte läuft es erst weiter.
Wiso wird das jetzt blockiert?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
schwa226

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

Re: DLL Init, Timer läuft nicht an

  Alt 15. Apr 2010, 20:24
Will ja nicht pushen, aber ich werde noch Wahnsinnig!

Das SetTimer geht nicht, auch nicht per Callback.
Dies wird erst ausgelöst wenn die Form angezeigt wird!

Der Ablauf ist nun so:
Die DLL wird geladen,
INIT-Funktion wird aufgerufen -> Thread wird erstellt -> Execute -> frMain (Form wird erzeugt):

Delphi-Quellcode:
procedure TMyMainThread.Execute;
var
  msg:Tmsg;
begin
  try
    InitFinished := False;

    if Not Assigned(frMain) then
      frMain := TfrMain.Create(NIL);

    frMain.AddLog('plugin got init');

    InitFinished := True;

    while not Terminated do
    begin
      Sleep(1);

      if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then //warten auf Message then
      begin
        case msg.message of
          WM_SHOWFORM:
            begin
              if IsWindow(msg.wParam) then
                if Application.Handle <> msg.wParam then
                  Application.Handle := msg.wParam;
              if NOT frMain.Showing then
                frMain.Show;
            end;
          WM_STARTUP:
            begin
              if Assigned(frMain) then
                frMain.Start_StartUp(StartDelay);
            end;
          WM_STOP:
            begin
              if Assigned(frMain) then
              begin
                frMain.AddLog('stopped plugin');
                if ((Assigned(frMain.HIDDevice)) and (not frMain.HIDDevice.IsPluggedIn)) then
                  frMain.JvHidDeviceController.CheckIn(frMain.HIDDevice);

                if Assigned(frMain.JvHidDeviceController) then
                  FreeAndNil(frMain.JvHidDeviceController);
              end;
            end;
          WM_QUIT: Terminate;
          else begin
            //TranslateMessage(msg);
            DispatchMessage(msg);
          end;
        end;
      end;
    end;

  finally
    if Assigned(frMain) then
    begin
      if frMain.Showing then
        frMain.Close;
      FreeAndNil(frMain);
    end;
  end;
end;
//funktion was ausgelöst wird wenn das Device entfernt wird:
Delphi-Quellcode:
procedure TfrMain.JvHidDeviceRemoval(HidDev: TJvHidDevice);
begin
  AddLog('Device got removed: ' + HIDDevice.ProductName);
  if ((Assigned(HIDDevice)) and (NOT HIDDevice.IsPluggedIn)) then
  begin
    if ((HidDev.Attributes.VendorID = VendorID) AND
      (HidDev.Attributes.ProductID = ProductID) AND
      (HidDev.ProductName = ProductName )) then
    begin
      try
        PostThreadMessage(MyMainThread.ThreadID, WM_STOP, 0, 0);

        OutputDebugString(PWideChar('Device got disconnected'));
      finally
//todo
      end;
    end;
  end;
end;
Nun bleibt meine DLL in frMain.JvHidDeviceController.CheckIn(frMain.HIDDev ice); stehen!

Wenn das Device geöffnet wird, wird für HIDDevice ein "WorkerThread" erzeugt.
Dieser will bei CheckIn gestoppt werden.

Und bei Thread Waitfor wartet man für immer, ausser die EXE wird beendet, dann kommt der Debugger sofort aus dem TThread.Waitfor zurück.

Irgendwie kommen immer wieder neue Probleme mit DLL + Form auf...
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#25

Re: DLL Init, Timer läuft nicht an

  Alt 15. Apr 2010, 21:53
Zitat von schwa226:
Das SetTimer geht nicht, auch nicht per Callback.
Dies wird erst ausgelöst wenn die Form angezeigt wird!
Ahhh Mist, da hab ich nicht weit genug gelesen
Zitat von MSDN:
When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.
Sorry
Ich bin mir aber irgendwie sicher, schon mal Timer in einem non-Form Projekt genutzt zu haben

Vielleicht wäre es noch ein Weg, das Fenster ganz von Hand via WinAPI, also Hier im Forum suchennon-VCL, zu erstellen. Damit umgeht man zumindest das dumme Gehampel mit den VCL-Interna, sprich Threads und das ganze Gelöt. Oder aber du nimmst MSDN-Library durchsuchenCreateTimerQueue + MSDN-Library durchsuchenCreateTimerQueueTimer (das neue Gegenstück zum mittlerweile obsoleten MMTimer setTimerEvent()). Da spricht zumindest kein Parameter von irgendwelchen Fensterhandles, und statt "Messages" les ich da ausschließlich "Callback" . Ist zwar erstmal mit Reindenken verbunden, aber man spart sich den ganzen Krampf den du bisher veranstalten musstest - NUR um einen Timer zu haben.
"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
 
#26

Re: DLL Init, Timer läuft nicht an

  Alt 16. Apr 2010, 11:19
Ja, hatte ich auch schon mal in einer DLL.

So eine Class mit Start(Interval), Stop usw.
Gibt hier irgendwo ein Beispiel dafür.

Da hatte es auch funktioniert, aber nun durch die Verwendung der DLL mit der Console bin ich auf diese Probleme gestoßen.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
schwa226

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

Re: DLL Init, Timer läuft nicht an

  Alt 27. Apr 2010, 17:28
Zu diesem leidigen Thema nochmal:

Mit der D6DLLSynchronizer.pas kann ich nun den SubThread beenden!

Jedoch habe ich noch Probleme mit dem Anzeigen der Form mit ShowModal.

Delphi-Quellcode:
procedure ShowSettings(Handle: Integer);
begin
  if Assigned(MyMainThread) then
  begin
    if Handle = 0 then
      Handle := GetActiveWindow;

    Application.Handle := Handle;

    TThread.Synchronize(MyMainThread, MyMainThread.FormShowModal);

    Application.Handle := 0;
  end;
end;
Wenn ich das nun ausführe wir mein Fenster angezeigt.
Wenn ich nun aber FreeAndNil(frMain) beim beenden durchführe bekomme ich den Error:
EOSError Code 5 (Zugriff verweigert).
Habe leider keine Ahnung warum dieser kommt und wo dieser Auftritt.

Wie kann man das noch lösen?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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