Wenn du per synchronize eine Methode des MainThreads ausführst, in der du dann die Daten direkt in die VST füllt, läuft diese Methode aber trotzdem im Thread und VST quittiert das mit einer passenden Meldung, dass das aus einem Thread nicht geht.
Du solltest die Daten per Synchronize an eine Datenstruktur im MainThread, auch über synchronize, übergeben, und anschließen schickst per PostMessage eine Msg an den Hauptthread. Nun kann der Hauptthread ein seinem eigenen Kontext das VST befüllen.
Hier mal aus dem Kopf, wie das ablaufen kann:
MainForm:
Delphi-Quellcode:
inferface
const
WM_UPDATEVST = WM_USER + 1;
.
.
.
private
LocalData: TDatenStruktur;
procedure BuildVSTData;
public
procedure UpdateVSTData(msg: TMessage); message WM_UPDATEVST;
procedure UpdateDataFromThread(ThreadData: TDatenStruktur);
end;
.
.
.
implementation
procedure TMainForm.BuildVSTData;
begin
//was auch immer du machst um deine Daten in die VST zu kriegen
end;
procedure TMainForm.UpdateVSTData(msg: TMessage);
begin
BuildVSTData;
end;
procedure UpdateDataFromThread(ThreadData: TDatenStruktur);
begin
LocalData.Assign(ThreadData); //Daten übertragen aus dem Thread in die Daten der MainForm
end;
Thread: (Im Create musst du das
Handle der MainForm übergeben).
Delphi-Quellcode:
procedure Execute;
var
FThreaData: TDatenStruktur;
begin
FThreadData:=TDatenStruktur.Create;
try
//Daten sammeln
synchronize(procdure
begin
frmMainForm.UpdateDataFromThread(FThreadData);
end);
PostMessage(MainThreadHandle, WM_UPDATEVST, 0, 0);
finally
FThreadData.Free;
end;
end;
Ich habe das hier so einfach reingeklöppelt (bin grad nicht am Rechner). Wird also so nicht AdHoc funktionieren. Aber wie ich das meine wird schon deutlich.
So kannst du das machen. Die Daten übergibst du im Threadcontext, aber das befüllen der VST läuft dann im MainFormContext.
Man muss das natürlich noch einiges verfeinern.