Попробуйте просто
Cells(emptyRow, 15).Value = Cells(emptyRow, 15).Value & "," & stCode1Box.Value
Так, теперь если несколько объектов сигнализируют, что я получу индекс первого. Я должен циклично выполниться, хотя мой массив, чтобы видеть, предупредили ли какие-либо другие?
Почему не только возвращаются вокруг в Ожидание ()? если несколько объектов сигнализировали, они будут все еще сообщены, когда Вы возвратитесь вокруг. Конечно, если у Вас будет очень быстро стреляющий первый объект в объектном массиве ожидания, то он исчерпает ресурсы другие; то, что Вы делаете, заказать Ваши объекты в объектном массиве ожидания частотой увольнения с наименее частым существом сначала.
BTW, где Вы используете бесконечное для (), Вы могли использовать goto. Если Вы действительно не оставляете цикл, безусловный goto наиболее правильно выражает Ваше намерение.
Да. Одна альтернатива была бы то, что Вы могли сделать WaitForSingleObject (дескриптор, 0) на каждом дескрипторе, который сразу возвратится и укажет, сообщены ли они или нет.
Править: Вот демонстрационный псевдокод для того, что я имею в виду:
ret = WaitForMultipleObjects()
if (ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + (count))
{
firstSignaled = ret - WAIT_OBJECT_0;
// handles[firstSignaled] guaranteed signalled!!
for (i = firstSignaled + 1; i < count; i++)
{
if (WaitForSingleObject(handles[i], 0) == WAIT_OBJECT_0)
{
// handles[i] Signaled!
}
}
}
Еще одна опция, которую Вы могли бы иметь, состоит в том, чтобы использовать RegisterWaitForSingleObject
. Идея состоит в том, что Вы отмечаете сообщенное состояние события во вторичном массиве от функции обратного вызова и затем предупреждаете об основном событии, которое используется для пробуждения основного потока (который называет WaitForSingleObject на основном событии).
Очевидно, необходимо было бы заботиться, чтобы гарантировать, что вторичный массив был защищен от доступа основным потоком, но он будет работать.