![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WaitForSingleObject & Synchronize [D5]
Cashmare © (2006-02-01 12:28:00)Здравствуйте, уважаемые мастера. Помогите разобраться глупому в следующем:
Выдержка из help'а:
DWORD WaitForSingleObject(
HANDLE hHandle, // handle of object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);
Windows NT: The handle must have SYNCHRONIZE access. For more information, see Access Masks and Access Rights.
Читал, ну ничего не понял! Куда этот SYNCHRONIZE вписать и с чем его едят?
Cashmare (2006-02-01 14:00:00) [1]2 Digitman
Уже все нормально, все работает. Была задача оживить покупной переходник PCI-CAN. Просто я его недоинициализировал, так сказать, вот ничего и не работало. :)))
Digitman (2006-02-01 13:45:00) [2]WAIT_ABANDONED , кстати, ты не получишь, поскольку в кач-ве объекта синхр-ции используешь ивент, а не мьютекс
Digitman (2006-02-01 13:44:00) [3]
> все равно не работает
Да что значит "не работает" ?!
Если будучи вызванной с INFINITE-таймаутом ф-ция блокирует вызвавший ее поток на неопределенное время, то это означает лишь одно - событие у тебя никогда не сигналит!
В противном случае ф-ция вернет управление с результатом
- WAIT_OBJECT_0 (событие просигналило),
- WAIT_TIMEOUT (при таймауте отличном от INFINITE),
- WAIT_ABANDONED (если в ходе ожидания объект-ивент перестал существовать),
- WAIT_FAILED (объект ожидания не существует или по причине, указанной в GetLastError)
Cashmare (2006-02-01 13:41:00) [4]Извиняюсь, вопрос снят. Кривые руки :)))
Всем спасибо!
Cashmare (2006-02-01 13:21:00) [5]2 Digitman.
Ставил таймаут INFINITE - все равно не работает!
Digitman (2006-02-01 13:18:00) [6]
> Не срабатывает
Откуда знаешь ?
М.б. ты просто не дождался его ? Тайм-аут ожидания у тебя всего 10 мс указан ..
Cashmare (2006-02-01 13:13:00) [7]Да, функции DefEvent и GetEventData - из сторонней библиотеки, заведомо рабочие, дело не в них.
Cashmare (2006-02-01 13:06:00) [8]Спасибо. Тогда непонятно, почему WaitForSingleObject не срабатывает. Описал структуры:
type
RX_TX_Buffer=packed record
FrameFormat:word;
StandartID:word;
ExtendedID:dword;
RTR:word;
DLC:word;
DataBytes:array [0..7] of word;
end;
TEventData=record
RxTxBuffer:RX_TX_Buffer;
IntrID:byte;
end;
var sa4Event:SECURITY_ATTRIBUTES;
evd:TEventData;
далее:
sa4Event.nLength:=sizeof(sa4Event);
sa4Event.lpSecurityDescriptor:=nil;
sa4Event.bInheritHandle:=True;
hEvent:=CreateEvent(@sa4Event,True,False,nil);
Получил хэндл, далее:
DefEvent(hEvent,True);
В параллельном потоке делаю:
res3:=WaitForSingleObject(hEvent,10);
if res3=WAIT_OBJECT_0 then begin
ResetEvent(hEvent);
GetEventData(@evd);
end;
Не срабатывает! Хотя физически событие происходит.
Игорь Шевченко (2006-02-01 12:55:00) [9]
> Использую CreateEvent
The handle returned by CreateEvent has EVENT_ALL_ACCESS access to the new event object and can be used in any function that requires a handle to an event object.
в EVENT_ALL_ACCESS SYNCHRONIZE входит по умолчанию.
Cashmare (2006-02-01 12:50:00) [10]Использую CreateEvent. И куда там вписать SYNCHRONIZE, все равно не понимаю :(((
Игорь Шевченко (2006-02-01 12:30:00) [11]
> Куда этот SYNCHRONIZE вписать и с чем его едят?
Когда получаешь Handle методом OpenXXXX или CreateXXXX в качестве параметров доступа должен быть указан SYNCRONIZE