Звоните WaitForMultipleObjects
, но делайте это правильно. Вы не показали этот код, и код, который вы показали, все равно выглядит неправильно.
Во-первых, похоже, что вы пытаетесь проверить, является ли элемент Events[1]
нулевым указателем. Нулевые указатели в Delphi пишутся nil
, а не null
; последний - функция , которая возвращает нулевое Variant
значение (но поскольку Variant
можно преобразовать во множество других типов, компилятор, вероятно, не предупредит вас о том, что ваш код неправильно). Затем выглядит так, как будто событие, которое вы обрабатываете, имеет параметр Cancel
, который вы можете установить, чтобы уведомить вызывающего абонента о том, что он должен прекратить то, что он делает, но вместо того, чтобы просто установить это, вы бросаете EAbort
исключение.
Если событие прогресса, которое вы здесь показываете, действительно выполняется в отдельном потоке, то оно не должно изменять свойства объектов VCL, таких как TProgressBar
. Вам нужно использовать Synchronize
, чтобы убедиться, что операции VCL выполняются только в потоке VCL.
Как я уже сказал, вам нужно позвонить WaitForMultipleObjects
собственности. Это означает передачу четырех параметров, с одной стороны. Похоже, у вас есть массив по крайней мере с двумя дескрипторами, поэтому назовите его так:
var
Ret: DWord;
Ret := WaitForMultipleObjects(2, @Events[1], False, Timeout);
case Ret of
Wait_Object_0: begin
// Events[1] is signaled
end;
Wait_Object_0 + 1: begin
// Events[2] is signaled
end;
Wait_Timeout: begin
// Neither is signaled. Do some more work, or go back to waiting.
end;
Wait_Failed: begin
RaiseLastOSError;
end;
end;
Если все, что вы хотите сделать, это проверить , есть ли сигнал о ручке, но вы не хотите ждать , пока он не будет сигнализирован, если это не так, тогда используйте значение времени ожидания ноль.