Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
В>Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
Посмотри что возвращает WaitForMultipleObjects (выделено жирным)
Return Values
If the function succeeds, the return value indicates the event that caused the function to return. This value can be one of the following.
Value Meaning
WAIT_OBJECT_0 to (WAIT_OBJECT_0 + nCount – 1) If bWaitAll is TRUE, the return value indicates that the state of all specified objects is signaled.
If bWaitAll is FALSE, the return value minus WAIT_OBJECT_0 indicates the lpHandles array index of the object that satisfied the wait. If more than one object became signalled during the call, this is the array index of the signalled object with the smallest index value of all the signalled objects.
В>Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
Вообще-то WAIT_FAILED == -1, а не 1, так что из цикла она выходить не должна. А возвращает она тебе скорее всего именно WAIT_FAILED, потому что хэнлы файлов ждать, согласно документации, не умеет (а кто вообще их умеет ждать?). И раз последний параметр у нее INFINITE, цикл там нафиг не нужен, а нужна нормальная обработка ошибок.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S В>> DWORD WINAPI Thread (LPVOID p) В>> { В>> HANDLE* h = (HANDLE*)p; В>> while ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE)) != 1) В>> { В>> } В>> return 0; В>> } В>>[/code]
В>>Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
S>Вообще-то WAIT_FAILED == -1, а не 1, так что из цикла она выходить не должна. А возвращает она тебе скорее всего именно WAIT_FAILED, потому что хэнлы файлов ждать, согласно документации, не умеет (а кто вообще их умеет ждать?). И раз последний параметр у нее INFINITE, цикл там нафиг не нужен, а нужна нормальная обработка ошибок.
Так он же ждет один из хэндлов (третий параметр = FALSE) Так что наздороье!
Просто надо было написать вот так
while (1)
{
if ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE) — WAIT_OBJECT_0) == 1)
break;
}
Здравствуйте Кирпа В.А., Вы писали:
КВ>Здравствуйте Sergey, Вы писали:
КВ>S В>>> DWORD WINAPI Thread (LPVOID p) В>>> { В>>> HANDLE* h = (HANDLE*)p; В>>> while ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE)) != 1) В>>> { В>>> } В>>> return 0; В>>> } В>>>[/code]
В>>>Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
S>>Вообще-то WAIT_FAILED == -1, а не 1, так что из цикла она выходить не должна. А возвращает она тебе скорее всего именно WAIT_FAILED, потому что хэнлы файлов ждать, согласно документации, не умеет (а кто вообще их умеет ждать?). И раз последний параметр у нее INFINITE, цикл там нафиг не нужен, а нужна нормальная обработка ошибок.
КВ>Так он же ждет один из хэндлов (третий параметр = FALSE) Так что наздороье!
Ага, шаз! Оно вообще не ждет — вываливается немедленно с WAIT_FAILED если любой из переданных хэндлов неправильный независимо от третьего параметра. По крайней мере, на моем компьютере.
КВ>Просто надо было написать вот так КВ>while (1) КВ>{ КВ> if ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE) — WAIT_OBJECT_0) == 1) КВ> break; КВ>}
Это то же самое, вид сбоку. Правильно делать так:
DWORD res;
do
{
res = WaitForMultipleObjects(2, h, FALSE, mytimeout);
} while (WAIT_TIMEOUT == res)
switch (res)
{
... обработка ошибок/событий
}
Тогда, по крайней мере, потоки потом прибивать не придется.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
S>Здравствуйте Кирпа В.А., Вы писали:
КВ>>Здравствуйте Sergey, Вы писали:
КВ>>S В>>>> DWORD WINAPI Thread (LPVOID p) В>>>> { В>>>> HANDLE* h = (HANDLE*)p; В>>>> while ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE)) != 1) В>>>> { В>>>> } В>>>> return 0; В>>>> } В>>>>[/code]
В>>>>Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
S>>>Вообще-то WAIT_FAILED == -1, а не 1, так что из цикла она выходить не должна. А возвращает она тебе скорее всего именно WAIT_FAILED, потому что хэнлы файлов ждать, согласно документации, не умеет (а кто вообще их умеет ждать?). И раз последний параметр у нее INFINITE, цикл там нафиг не нужен, а нужна нормальная обработка ошибок.
КВ>>Так он же ждет один из хэндлов (третий параметр = FALSE) Так что наздороье!
S>Ага, шаз! Оно вообще не ждет — вываливается немедленно с WAIT_FAILED если любой из переданных хэндлов неправильный независимо от третьего параметра. По крайней мере, на моем компьютере.
КВ>>Просто надо было написать вот так КВ>>while (1) КВ>>{ КВ>> if ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE) — WAIT_OBJECT_0) == 1) КВ>> break; КВ>>}
S>Это то же самое, вид сбоку. Правильно делать так:
S>
S>Тогда, по крайней мере, потоки потом прибивать не придется.
Согласен что не надо ждать хендла порта (этот хэндл для WaitForMultipleObjects недопустим)
Я просто намекнул что проверять надо разницу WaitForMultipleObjects() — WAIT_OBJECT_0
Вот она и будет равна 1 когда второй хендл установится(то бишь когда сработает SetEvent)
Здравствуйте Sergey, Вы писали:
S>Здравствуйте Кирпа В.А., Вы писали:
КВ>>Здравствуйте Sergey, Вы писали:
КВ>>S В>>>> DWORD WINAPI Thread (LPVOID p) В>>>> { В>>>> HANDLE* h = (HANDLE*)p; В>>>> while ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE)) != 1) В>>>> { В>>>> } В>>>> return 0; В>>>> } В>>>>[/code]
В>>>>Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
S>>>Вообще-то WAIT_FAILED == -1, а не 1, так что из цикла она выходить не должна. А возвращает она тебе скорее всего именно WAIT_FAILED, потому что хэнлы файлов ждать, согласно документации, не умеет (а кто вообще их умеет ждать?). И раз последний параметр у нее INFINITE, цикл там нафиг не нужен, а нужна нормальная обработка ошибок.
КВ>>Так он же ждет один из хэндлов (третий параметр = FALSE) Так что наздороье!
S>Ага, шаз! Оно вообще не ждет — вываливается немедленно с WAIT_FAILED если любой из переданных хэндлов неправильный независимо от третьего параметра. По крайней мере, на моем компьютере.
КВ>>Просто надо было написать вот так КВ>>while (1) КВ>>{ КВ>> if ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE) — WAIT_OBJECT_0) == 1) КВ>> break; КВ>>}
S>Это то же самое, вид сбоку. Правильно делать так:
S>
S>Тогда, по крайней мере, потоки потом прибивать не придется.
Согласен что не надо ждать хендла порта (этот хэндл для WaitForMultipleObjects недопустим)
Я просто намекнул что проверять надо разницу WaitForMultipleObjects() — WAIT_OBJECT_0
Вот она и будет равна 1 когда второй хендл установится(то бишь когда сработает SetEvent)
Здравствуйте Sergey, Вы писали:
S>Здравствуйте Кирпа В.А., Вы писали:
КВ>>Здравствуйте Sergey, Вы писали:
КВ>>S В>>>> DWORD WINAPI Thread (LPVOID p) В>>>> { В>>>> HANDLE* h = (HANDLE*)p; В>>>> while ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE)) != 1) В>>>> { В>>>> } В>>>> return 0; В>>>> } В>>>>[/code]
В>>>>Когда выставляю h[1] т.е. SetEvent (в другом потоке само — собой), функция WaitForMultipleObjects начисто это игнорирует, хотя должна бы была возвратить 1, обеспечив выход из цикла и завершение потока. Почему?
S>>>Вообще-то WAIT_FAILED == -1, а не 1, так что из цикла она выходить не должна. А возвращает она тебе скорее всего именно WAIT_FAILED, потому что хэнлы файлов ждать, согласно документации, не умеет (а кто вообще их умеет ждать?). И раз последний параметр у нее INFINITE, цикл там нафиг не нужен, а нужна нормальная обработка ошибок.
КВ>>Так он же ждет один из хэндлов (третий параметр = FALSE) Так что наздороье!
S>Ага, шаз! Оно вообще не ждет — вываливается немедленно с WAIT_FAILED если любой из переданных хэндлов неправильный независимо от третьего параметра. По крайней мере, на моем компьютере.
КВ>>Просто надо было написать вот так КВ>>while (1) КВ>>{ КВ>> if ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE) — WAIT_OBJECT_0) == 1) КВ>> break; КВ>>}
S>Это то же самое, вид сбоку. Правильно делать так:
S>
S>Тогда, по крайней мере, потоки потом прибивать не придется.
Согласен что не надо ждать хендла порта (этот хэндл для WaitForMultipleObjects недопустим)
Я просто намекнул что проверять надо разницу WaitForMultipleObjects() — WAIT_OBJECT_0
Вот она и будет равна 1 когда второй хендл установится(то бишь когда сработает SetEvent)
Если параметром данной функции будет HANDLE h[2], где h[0] = CreateEvent (NULL, FALSE, FALSE, NULL); и h[1] анологично то если мы из другого потока выставим h[0] (SetEvent'ом) то сделаем один оборот цикла, если выставим h[1] — завершим поток.
DWORD WINAPI Thread (LPVOID p)
{
int i = 0;
HANDLE* h = (HANDLE*)p;
while ((i = WaitForMultipleObjects (2, h, FALSE, INFINITE)) != 1)
{
afxDump << i << "\n";
}
return 0;
}
У меня же h[0] — это HANDLE порта и я искренне верил, что в этом случае при поступлении в порт инфы функция вернёт 0, тем самым сделаем один оборот цикла, при установке h[1] функция вернёт 1 и поток завершится.
Видимо ошибался.
S>Ага, шаз! Оно вообще не ждет — вываливается немедленно с WAIT_FAILED если любой из переданных хэндлов неправильный независимо от третьего параметра. По крайней мере, на моем компьютере.
У меня не вываливается не вываливается.
Здравствуйте Владислав, Вы писали:
В>У меня же h[0] — это HANDLE порта и я искренне верил, что в этом случае при поступлении в порт инфы функция вернёт 0, тем самым сделаем один оборот цикла, при установке h[1] функция вернёт 1 и поток завершится. В>Видимо ошибался.
Угу.
S>>Ага, шаз! Оно вообще не ждет — вываливается немедленно с WAIT_FAILED если любой из переданных хэндлов неправильный независимо от третьего параметра. По крайней мере, на моем компьютере. В>У меня не вываливается не вываливается.
Не вываливается из функции или не вываливается из цикла? Если первое, то какая операционка?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
S>Не вываливается из функции или не вываливается из цикла? Если первое, то какая операционка?
Из функции вываливается но не с WAIT_FAILED а с номером HANDLE порта, в данном случае 0. Удивительно то, что функция ReadFile (h[0],...) в теле цикла возвращает прочитанные байты
Операционка Windows XP.
Да кстати: