Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2013, 14:37   #1
peeper
Новичок
Джуниор
 
Регистрация: 28.11.2013
Сообщений: 3
По умолчанию Не срабатывает waitforsingleobject

Главный поток:

Код:
function TFreHolder.GetVersion: TFreHolderVersion;
Var
 Data   : TBArray;
 StrLen : Integer;
begin
 SetLength(Data, 0);

 FFrePro.SendCommand(PROTO_COMVERSION, Data);

 ResetEvent(FAsyncMutex);

 if (WaitForSingleObject(FAsyncMutex, PROTO_COMMANDTIMEOUT) = WAIT_TIMEOUT) Then
  Begin
   ShowMessage('Timeout');
   ResetEvent(FAsyncMutex);
   Exit;
  End;

 Result.DType    := BytesToWord(FActivePackage.User.Parameters, 0);
 Result.DVersion := BytesToWord(FActivePackage.User.Parameters, 2);
 StrLen          := BytesToByte(FActivePackage.User.Parameters, 4);

 if StrLen < 32
   then Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 5)
   else Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 4);
end;
В потоке, который следит за COM-портом:
Код:
...
Begin
     FActivePackage := Package;
     SetEvent(FAsyncMutex)
End;
...
Все время выбивает таймаут, хотя setevent вызывается.

Создавался так:
Код:
FAsyncMutex  := CreateEvent(Nil, True, False, 'FRE_EVENT');
peeper вне форума Ответить с цитированием
Старый 28.11.2013, 16:06   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
function TFreHolder.GetVersion: TFreHolderVersion;
Var
 Data   : TBArray;
 StrLen,start : Integer;
begin
 SetLength(Data, 0);

 FFrePro.SendCommand(PROTO_COMVERSION, Data);

 ResetEvent(FAsyncMutex);
 start:=GetTickCount;

 while(start+PROTO_COMMANDTIMEOUT>GetTickCount) do
  begin
   if (WaitForSingleObject(FAsyncMutex, 0); = WAIT_OBJECT_0)   Then
    Begin
     Result.DType    := BytesToWord(FActivePackage.User.Parameters, 0);
     Result.DVersion := BytesToWord(FActivePackage.User.Parameters, 2);
     StrLen          := BytesToByte(FActivePackage.User.Parameters, 4);

     if StrLen < 32
      then Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 5)
      else Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 4);
     exit;
    End;
  Application.ProcessMessages;
 end;
 ShowMessage('Timeout');
 ResetEvent(FAsyncMutex);
end;
как то так попробуй.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.11.2013, 16:10   #3
peeper
Новичок
Джуниор
 
Регистрация: 28.11.2013
Сообщений: 3
По умолчанию

Большое спасибо, так действительно работает.
peeper вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что означают CreateEvent и WaitForSingleObject? _PROGRAMM_ Помощь студентам 4 05.04.2012 13:29
Многопоточность showmodal и WaitForSingleObject bulldog5293 Общие вопросы Delphi 24 24.01.2011 18:46
WaitForSingleObject besserebrenik Win Api 3 15.02.2010 22:40
WaitForSingleObject в Delphi 2009 Хамяг Win Api 11 03.12.2009 09:06
вопрос по функции WaitForSingleObject shurik_7866 Общие вопросы Delphi 2 08.12.2008 10:53