Delphi, передавая указатель через BeginThread - PullRequest
1 голос
/ 04 ноября 2010

Я создаю поток, используя BeginThread.

В процедуре, которую я использую для запуска потока, я хочу передать указатель на логическую переменную, чтобы и разветвленный поток, и основной поток могли получить к нему доступуправляющая переменная, которая сообщает одному, когда другое сделано.

Поскольку начальный поток получает указатель для параметров, которые я пытался передать в Addr (MyPointerVar), но я получаю ошибки.

Но мне нужно бежать, поэтому я не могу закончить свои мысли здесь сегодня вечером.Но если у кого-то есть идеи по этому поводу, я ценю это.

Ответы [ 2 ]

8 голосов
/ 04 ноября 2010

Используйте оператор адреса '@', чтобы передать адрес переменной в 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...
0 голосов
/ 08 ноября 2010

Ответ Реми, приведенный выше, является правильным решением.

Я делал то, что Реми предлагал выше, и у меня все еще были проблемы, и с быстрым тестом я только что сделал, кажется, моя ошибка заключалась в том, что я имел дело с процедурой с резьбойв объекте, отличном от того, где вызывался beginthread.

...