2010-11-04 4 views
1

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

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

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

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

+0

Я больше не получаю ошибок, но у меня все еще нет необходимых функций. Указатель, который я получаю изнутри разветвленного потока, не указывает на то же место, что и тот, который я отправляю. – Tim

+0

да, это будет то же самое значение указателя (иначе собственный класс 'TThread' Delphi не будет работать правильно), так что вы очевидно, делают что-то не так с вашей стороны. Пожалуйста, покажите свой фактический код. –

+0

@Remy: Это тоже моя оценка, я воссоздаю ее в новом проекте и посмотрю, все-таки это произойдет, а затем опубликуйте этот код. – Tim

ответ

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... 
+0

Спасибо, Реми, я предпочитаю первый способ, так как я планирую сделать вторую версию, где я передаю целое число, чтобы сделать индикатор выполнения. Однако то, что у меня было раньше, было очень похоже на то, что вы делаете, однако адрес, который я передаю с @ThreadDone, - это другой адрес, который я получаю в параметре. – Tim

+0

@Tim: пожалуйста, отметьте ответ Реми как «принятый», нажав на галочку рядом с ним. –

+0

Jeroen: Я ценю ответ и помощь Remys, но он полностью не ответил на мой вопрос. Я не должен был четко указывать в моем комментарии выше, поэтому я добавил комментарий к моему вопросу выше, который объясняет лучше. – Tim

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^