Zitat:
Unter Windows 10 kann man so viele Threads (die andere Aufgaben machen) erstellen wie man möchte
Daher ist es schon gut wenn mehr Leute an der Sache arbeiten.. Hobby mäßig natürlich
Eine wirklich fertige und vor allem gute Komponente in der Hinsicht habe ich über die Jahre nicht wirklich ausmachen können für Delphi.
Ich habe jetzt folgendes gemacht. (Bin dafür wieder auf Sendmessage umgestiegen da ich nicht weis wie man den Thread in die Class TAudioVolume integriert.)
*.pas angehängt.
Wenn die Message ausgelöst wird.
Delphi-Quellcode:
procedure TSessionThread.WndProc(var Msg: TMessage);
begin
if FThreadHandle <> 0 then
begin
case Msg.Msg of
WM_SessionCreate:
Msg.Result := SendMessage(FThreadHandle, WM_SessionCreate, Msg.WParam, Msg.LParam);
WM_SessionDestroy:
Msg.Result := SendMessage(FThreadHandle, WM_SessionDestroy, Msg.WParam, Msg.LParam);
else
Msg.Result := DefWindowProc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam);
end;
end else
Msg.Result := DefWindowProc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam);
end;
Delphi-Quellcode:
procedure TAudioVolume.ProcessMsg(var Msg: TMessage);
begin
case Msg.Msg of
WM_SessionCreate:
if Assigned(FOnSessionCreated) then
OnSessionCreated(IAudioSessionControl(Msg.WParam));
WM_SessionDestroy:
if Assigned(FOnSessionDisconnected) then
OnSessionDisconnected(Msg.WParam);
end;
end;
dann kommt sie hier an.
in OnSessionCreated.. sorge ich dann dafür das nur eine Message der gleichen PID zur Anwendung durchgelassen wird.
Delphi-Quellcode:
function TAudioVolume.OnSessionCreated(const NewSession: IAudioSessionControl): HResult;
var
SessionControl2: IAudioSessionControl2;
PID: uint;
IntI: Integer;
begin
Result := S_OK;
if Supports(NewSession, IAudioSessionControl2, SessionControl2) then
begin
SetLength(PidList, PIDIndex + 1);
SessionControl2.GetProcessID(PID);
for IntI := 0 to (Length(PidList) - 1) do
if PidList[IntI] = PID then
begin
SessionControl2 := nil;
exit;
end;
PidList[PIDIndex] := PID;
end;
if (MainThreadID <> GetCurrentThreadId) then
begin
TThread.Synchronize(nil,
procedure
begin
if Assigned(FOnSessionCreated) then
begin
SessionPIDCreated := PID;
FOnSessionCreated(NewSession);
inc(PIDIndex);
end;
end);
end;
end;
das funktioniert soweit. (Bei Message Boxen) aber auch da mosert Delphi schon rum wegen Deadlock.
Aber!
Ich kann keine neue Grafikkomponente erstellen der Thread blockt irgendwie sobald ich einen zugriff auf einer der Funktionen von TAudioVolume starte.
Dann hängt der Thread.
Ein einfacher Aufruf von SimpleVolume := nil; reicht da schon.
Keine Ahnung was da wieder abgeht.
Ich weis nicht wie ich dann die Komponente erstellen soll wenn nicht hier.
PS:
OnSessionDisconnected funktioniert nie egal ob mit Event Thread oder nicht.
Ist das bei dir auch so?
Wenn ja muss ich das später über die PID steuern.
gruss