9

スレッドとその内部 (スレッド クラス) にプログレス ルーチン (関数) があります。

私はスレッド内でこれをやろうとします:

CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, nil, nil, 0);

しかし、「変数が必要です」というエラーが表示されます(エラーはこれにあります: @ProgressRoutine )。関数 ProgressRoutine をスレッド外にすると、すべてが正常になります。

スレッド内でその関数を使用する方法は?

ありがとう。

4

1 に答える 1

10

「スレッドの外側」と「スレッドの内側」とは、「スタンドアロン関数として」と「スレッド オブジェクトのメンバーとして」という意味ですか? 関数がオブジェクトのメンバーである場合、その署名は異なるため、コンパイラが期待するものと一致しないためです。

これを解決する方法は、パラメーターとしてに渡すSelfことです。これにより、コールバックに返されるポインターが与えられます。パラメータをスレッド オブジェクト参照として解釈し、それを使用して同じパラメータでスレッド オブジェクトのメソッドを呼び出すスタンドアロン関数としてコールバックを記述します。CopyFileExlpDatalpData

編集:簡単な例。コールバックには、「value」と「lpData」という 2 つのパラメーターしかないとします。

procedure ProgressRoutine(value: integer; lpData: pointer); stdcall;
var
  thread: TMyThreadClass;
begin
  thread := lpData;
  thread.ProgressRoutine(value);
end;

procedure TMyThreadClass.ProgressRoutine(value: integer);
begin
  //do something with the value here
end;

procedure TMyThreadClass.Execute;
begin
  CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, Self, nil, 0);
  //passing Self to lpData; it will get passed back to the callback
end;
于 2011-08-09T00:19:04.723 に答える