1

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 と同期できないことに関係していると思います。同期を回避するためのアイデアはありますか (それが実際に問題である場合)?

4

0 に答える 0