1

BeginThread を使用してスレッドを作成しています。

スレッドを開始するために使用している手順では、ブール変数へのポインタを渡したいので、分岐したスレッドとメイン スレッドの両方が制御変数としてアクセスして、もう一方が完了したときに通知できるようにします。

開始スレッドはパラメーターのポインターを受け取るため、Addr(MyPointerVar) を渡そうとしましたが、エラーが発生しています。

しかし、私は走らなければならないので、今夜ここで考えを終えることはできません. しかし、誰かがこれを行うことについて何かアイデアを持っているなら、私はそれを感謝します.

4

2 に答える 2

8

「@」アドレス演算子を使用して、変数のアドレスを BeginThread() に渡します。次に例を示します。

var
  ThreadDone: Boolean;
  ThreadId: LongWord;
  ThreadHandle: Integer;

function ThreadFunc(PThreadDone: PBoolean): Integer;
begin
  ...
  PThreadDone^ := True;
  Result := 0;
end;

...

ThreadHandle := BeginThread(nil, 0, @ThreadFunc, @ThreadDone, 0, ThreadId);

そうは言っても、別の変数を使用せずにスレッドが完了したかどうかをメインスレッドが確認する別の方法は、BeginThread() によって返されたスレッドハンドルを WaitForSingleObject() に渡し、それが WAIT_OBJECT_0 を返すかどうかを確認することです。

var
  ThreadId: LongWord;
  ThreadHandle: Integer;

function ThreadFunc(Parameter: Pointer): Integer;
begin
  ...
  Result := 0;
end;

...

ThreadHandle := BeginThread(nil, 0, @ThreadFunc, nil, 0, ThreadId);
...
if WaitForSingleObject(THandle(ThreadHandle), 0) = WAIT_OBJECT_0 then
  finished...
else
  still running...
于 2010-11-04T20:43:27.620 に答える
0

上記のレミーの答えは正しい解決策です。

私はレミーが上で提案したことをしていましたが、まだ問題がありました.簡単なテストで、beginthreadが呼び出された場所とは別のオブジェクトでスレッド化されたプロシージャを扱うことに問題があったようです.

于 2010-11-08T15:05:03.120 に答える