![]() |
Re: DLL Init, Timer läuft nicht an
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? |
Re: DLL Init, Timer läuft nicht an
Du könntest TThread.Syncronize in der DLL nutzen, um mit dem Thread zu synchronisieren.
|
Re: DLL Init, Timer läuft nicht an
Hab's mit Synchronize versucht, da kommt wieder der Zugriff-Verweigert Fehler:
Delphi-Quellcode:
EDIT:
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; 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:
Wenn ich die EXE beende, die die DLL geladen hatte läuft es erst weiter.
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; Wiso wird das jetzt blockiert? |
Re: DLL Init, Timer läuft nicht an
Will ja nicht pushen, aber ich werde noch Wahnsinnig! :wall:
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:
//funktion was ausgelöst wird wenn das Device entfernt wird:
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;
Delphi-Quellcode:
Nun bleibt meine DLL in frMain.JvHidDeviceController.CheckIn(frMain.HIDDev ice); stehen!
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; 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... |
Re: DLL Init, Timer läuft nicht an
Zitat:
Zitat:
Ich bin mir aber irgendwie sicher, schon mal Timer in einem non-Form Projekt genutzt zu haben :gruebel: Vielleicht wäre es noch ein Weg, das Fenster ganz von Hand via WinAPI, also ![]() ![]() ![]() |
Re: DLL Init, Timer läuft nicht an
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. |
Re: DLL Init, Timer läuft nicht an
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:
Wenn ich das nun ausführe wir mein Fenster angezeigt.
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 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? :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz