我正在使用 BeginThread 创建一个线程。
在我用来启动线程的过程中,我想将一个指针传递给一个布尔变量,以便分叉线程和主线程都可以将其作为控制变量访问,以告知另一个何时完成。
由于开始线程接受参数的指针,因此我尝试传入 Addr(MyPointerVar) 但我收到错误。
但我必须跑,所以今晚我无法在这里完成我的想法。但是,如果有人对此有任何想法,我将不胜感激。
我正在使用 BeginThread 创建一个线程。
在我用来启动线程的过程中,我想将一个指针传递给一个布尔变量,以便分叉线程和主线程都可以将其作为控制变量访问,以告知另一个何时完成。
由于开始线程接受参数的指针,因此我尝试传入 Addr(MyPointerVar) 但我收到错误。
但我必须跑,所以今晚我无法在这里完成我的想法。但是,如果有人对此有任何想法,我将不胜感激。
使用“@”地址运算符将变量的地址传递给 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...
上面雷米的答案是正确的解决方案。
我正在做 Remy 上面建议的事情,但仍然遇到问题,并且通过快速测试,我刚刚做了似乎我的错是处理线程过程与调用 beginthread 的对象不同的问题。