Delphi XE2 で DelphiPraxis の WorkerThread を使用しています。 http://www.delphipraxis.net/93835-workerthread-der-diener-im-hintergrund.html JobThread で、DLL をロードしていますが、これは (テストのために) 待機しています。
function DLLClass.doStuff(): boolean;
var
I: integer;
begin
try
for I := 0 to 100 do
begin
sleep(10);
if (assigned(StatusCallback)) then
StatusCallback(PWideChar(I));
end;
Result := true;
except
on e: exception do
begin
error := 'DLL FEHLER: ' + e.ClassName + ' - ' + e.Message;
Result := false;
end;
end;
end;
「StatusCallback」は、DLL をロードしているスレッド内のプロシージャへの参照です。
TStatusUpdate = procedure(Status: PWideChar) of object; stdcall;
私のコールバックは次のようになります。
procedure JobThread.statuscall(status: pwidechar); stdcall;
begin
//saving the Status in a global Variable..
if Assigned(OnStatus) then
fThread.Synchronize(syncStatus);
end;
どの呼び出し:
procedure JobThread.syncStatus;
begin
if Assigned(OnStatus) then
begin
OnStatus(self);
end;
end; //<- AV here!
OnStatus イベントハンドラ:
Procedure TfMain.uploadStatus(aJob: TWorkerThreadJob);
begin
//doing nothing.. yet an AV
sleep(10);
end;
この問題は、DLL が MainThread と同期できないことに関係していると思います。同期を回避するためのアイデアはありますか (それが実際に問題である場合)?