Меню

Wait for single object 2 ошибка

Hi. I have the same issue and sent an email to Easyanticheat. Unfortunately, their response was not helpful in my case but maybe you will have more luck. Hope this helps

The cause to this error is the current Windows installation somehow being in a corrupted state. For some reason a simple file operation that should take less than a second is taking over half a minute and timing out, resulting in the error. As the first step, please use the Windows Update to ensure that your Windows is fully up-to-date. After installing all available Windows updates, verify all system files explicitly by running the following command in command prompt 

as Administrator

sfc /scannow.

If the problem persists after updating Windows, we recommend running an anti-virus scan as it is possible that the system has been infected by a virus. You can use for example the free Malwarebytes anti-rootkit scan to check this.

Lastly, if the error still persists, you may need to use the Windows System Restore function to revert your computer to a previously working state. Unfortunately, after having investigated this extremely rare issue on few end-user PCs, we have not been able to identify the specific cause to what makes the system stall the failing operation for such long time period without no apparent reason.

Код ошибки 0x80004005 что это такое и как это исправить

Код ошибки 0x80004005: что это такое и как это исправить

Это ошибка, которая может появляться как самостоятельно, так и вместе с другими ошибками. Выглядит обычно таким образом: “Error Code 080004005. Unspecified error”. Но все они легко решаются.

Почему появляется данное сообщение?

Код ошибок 0x80004005 обычно происходит при доступе к общим папкам или дискам, при использовании определенных программ или при установке обновлений. Вот наиболее распространенные причины кода ошибок 0x80004005:

Компания Microsoft по-прежнему не решила многочисленные проблемы с глобальными обновлениями «Виндовс». Пользователи компьютеров часто встречают ошибку:

Это может быть связано с рядом причин, наиболее распространенными из них являются следующие:

К счастью, есть способы решения для каждого из этих сценариев.

Способ исправления проблем с активацией

Первое, что мы должны сделать – это убедиться в активации операционной системы. Для исправления ошибки 0x80004005 необходимо открыть меню «Пуск», а затем выбрать «Парраметры». В открывшемся окне выбираем пункт «Обновление и безопасность» и в появившемся списке слева нажимаем на «Устранение неполадок». Таким образом мы открыли еще одну вкладку, в которой необходимо запустить диагностику и устранить неполадку «Центра обновления». В большинстве случаев все проблемы будут решены в автоматическом режиме.

Способ исправления проблем с поврежденными файлами

Достаточно часто случается, что поврежден системный файл opencl. dll, из-за которого возникает сообщение “Error Code 0x80004005. Unspecified error“. Для проверки целостности и устранения проблемы вы можете воспользоваться одним из встроенных в Windows 10 инструментов: SFC (система проверки файлов) или DISM (обслуживание и управление образами обновления).

Также можно попробовать полностью очистить директорию загрузки файлов обновления. Для этого запустите файловый менеджер и перейдите в папку «C:WindowsSoftwareDistributionDownload». После чего удалите все файлы и другие папки, которые увидите. Это заставит Windows 10 загрузить все файлы обновления заново.

Ошибка при попытке доступа к общим папкам и дискам

Если код 0x80004005 появляется при попытке доступа к общим папкам и дискам, то проблема может быть в реестре или в наличии скрытых виртуальных сетевых адаптеров.

Способ исправления ошибки 0x 80004005 в реестре

В обоих случаях ставим значение «1», и не забудьте нажать «ОК». Возможно, потребуется перезагрузка компьютера.

Внимание! Не удаляйте и не меняйте ничего в реестре, если вы не знаете, что делаете.

Способ исправления лишних виртуальных сетевых устройств

Нажмите кнопки «Windows» + R и введите hdwwiz. cpl. Так вы быстро попадете в диспетчер устройств. Нажмите «Вид» в меню и выберите «Показать скрытые устройства». Просмотрите список сетевых адаптеров. Если вы увидели устройство под названием Microsoft 6to4, то они, вероятнее всего, и стали причиной ошибки 80004005. Их надо удалить.

После этого перезагрузите компьютер и проверьте результат.

«E-FAIL 0x80004005» в VirtualBox

Появление 0x80004005 на VirtualBox обычно связана с ключом реестра.

Способ исправления

Нажмите кнопки «Windows» + R. В появившемся окне введите regedit для открытия редактора реестра. Перейдите к следующему пути реестра:

Если сообщение с надписью 80004005 по-прежнему появляется, то:

Вывод

Любая неисправность в работе Windows 10 поддается лечению. Но самый верный, а для многих единственный, способ исправить ошибку 0x 80004005 – это чистая установка «Виндовс 10». При этом удалятся все сохраненные данные, установленные приложения и ошибки.

Код ошибки: 30005 (CreateFile failed with 32.)

С каждым днем разработчики пытаются удивить пользователей новыми играми и даже игровыми жанрами. С ростом их количества, увеличивается и число новых, до этого неизвестных ошибок. При запуске таких популярных игр, как Tom Clancy’s Ghost Recon Wildlands, CrossOut, Dead by Daylight, Fortnite и других в компьютере появляется сообщение с кодом ошибки 30005 (CreateFile Failed with 32.). Как её решить — читайте в этой статье.

Причины появления окна с ошибкой 30005

Ошибка может появляться в результате нарушения файлов игры. Или при блокировке некоторых игровых файлов вашим антивирусным программным обеспечением. В отдельных случаях этот сбой может быть временным. Если попытаться через некоторое время снова запустить игру вы заметите, что она решилась сама собой. Следуйте всем приведенным далее инструкциям, и вы с большей степенью вероятности сможете исправить ошибку 30005 (CreateFile failed with 32.). Если вам не удастся это сделать — обязательно напишите об этом в комментариях, чтобы мы смогли найти для вас новые способы устранения.

Быстрые решения ошибки

Как это ни банально звучит, но многим помогает избавиться от ошибки простая перезагрузка компьютера. Можно предположить, что пользователи в первую очередь выполняют это действие. И все же тем, кто еще не пробовал — перезагрузите систему. Если игра заработала после перезагрузки, то скорее всего это были незначительные сбои в оперативной памяти вашего компьютера. Поэтому вы можете больше не встретить её при запуске.

Даже если она и появится еще раз через время, снова перезагрузите компьютер. А лучше — почистите его от ненужных файлов и программ.

Еще один совет — не запускайте вместе несколько программ одновременно. Особенно, если в вашем компьютере мало оперативной памяти (до 2Гб). Чтобы продолжить, нам нужны быть уверенным, что файлы игры в порядке. Для этого запустите клиент Steam и выполните проверку.

Если проверкой будут найдены отсутствующие файлы игры, необходимо переустановить игру.

Работа с антивирусом

Перед следующими действиями проверьте свою систему на вирусы средством, которое есть у вас в компьютере. Чтобы устранить ошибку с кодом 30005 CrateFile Failed with 32, в некоторых случаях достаточно отключить на время ваш антивирус. Если вы не устанавливали дополнительных, нужно выключить встроенный Защитник Windows.

Для отключения дополнительного вируса необходимо нажать на стрелочку внизу экрана и ПКМ выбрать ваш антивирус. Выберите «Управление экранами» (Avast) или подобный пункт в других антивирусах и укажите время, на сколько нужно деактивировать программу. Если этой возможности нет — удалите антивирус и запустите игру. Если игра заработает, скачайте снова антивирусную программу и добавьте игру в её исключения. Как это сделать, вы можете найти на сайте разработчика антивируса.

Удаление установочного файла EasyAntiCheat

Следующий метод основан на удалении установочного файла АнтиЧита из папки с игрой. Вам необходимо найти полный путь к папке с игрой. Если установка производилась по умолчанию, значит ваша игра должна находится на диске C:. В других случаях ищите папку там, куда вы указали установку.

Такой же файл есть в папке Steam на вашем компьютере, например, C:Usersимя пользователяSteamsteamappscommomназвание игры. Если вы не нашли его в папке с игрой, попробуйте удалить в папке Стим. Если результатов нет — верните файл на прежнее место.

Источники:

Https://fixbin. ru/kod-oshibki-0x80004005/

Https://rusadmin. biz/oshibki/kod-oshibki-30005-createfile-failed-with-32/

MSDN says

If the function fails, the return value is WAIT_FAILED. To get extended error information, call GetLastError.

The code is:

HANDLE     m_mutex_handle;    /**< m_mutex_handle. The handle to the created mutex. */
m_mutex_handle = ::CreateMutex( 0, false, NULL );
::WaitForSingleObject( m_mutex_handle, INFINITE );

But what are the reasons that could happen?

asked Oct 17, 2008 at 0:32

mat_geek's user avatar

1

If you lack the SYNCHRONIZE privilege on the object, then you cannot wait. WAIT_FAILED will be returned.

answered Oct 17, 2008 at 0:56

1800 INFORMATION's user avatar

1800 INFORMATION1800 INFORMATION

129k29 gold badges159 silver badges239 bronze badges

Passing in a bogus object might cause that.

answered Oct 17, 2008 at 0:41

1

Closing a handle while the handle is being waited on can also cause undefined behaviour.

answered Oct 17, 2008 at 0:46

Windows programmer's user avatar

В случае многопоточности иногда нам нужно дождаться завершения потока, прежде чем продолжить выполнение других действий.Для этого вы можете использовать функцию Windows API WaitForSingleObject или WaitForMultipleObjects. Обе эти функции ждут, пока объект не будет помечен как сигнализированный, прежде чем вернуться.
Итак, что это за сигнал? Прежде всего, мы можем предположить, что существует файл и два потока. Мы оговариваем, что этот файл может быть доступен и открыт только одним потоком одновременно. Как наш поток узнает, обращается ли этот файл в настоящее время к другим потокам? Мы можем позволить потоку ждать в бесконечном цикле. Один из циклов пытается открыть файл и получить к нему доступ, пока он не может быть открыт; хотя это может достичь цели, бесконечный цикл займет много памяти, поэтому окна устанавливают семафор. Простое понимание роли семафора — это бит флага. В нашей вышеупомянутой проблеме этот файл имеет семафор. Первоначально мы устанавливаем семафор в FALSE, и только когда семафор FALSE может открыть поток и получить доступ к файлу. Затем, когда приходит первый поток, семафор ЛОЖЬ, поток открывает файл для доступа и устанавливает семафор в ИСТИНА; когда первый поток обращается к файлу, приходит второй поток, а семафор еще не ИСТИНА, так что второй поток ждет.Этот процесс ожидания — WaitForSingleObject. WaitForSingleObject перейдет в очень эффективное состояние ожидания в спящем режиме во время процесса ожидания, который занимает очень небольшое количество процессорного времени.

WaitForSingleObject()

1. Форматировать

DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);

Есть два параметра, а именно THandle и Timeout (единицы миллисекунды).

Если вы хотите дождаться потока, вам необходимо указать дескриптор потока и соответствующее время ожидания. Конечно, если вы хотите ждать бесконечно, параметр Timeout может указывать системную константу INFINITE.

2. Цель

Он может ждать следующих типов объектов:

Event,Mutex,Semaphore,Process,Thread 

3. Тип возврата

Есть три типа возврата:

WAIT_OBJECT_0, что означает, что у ожидающего объекта есть сигнал (для потока это означает конец выполнения);

WAIT_TIMEOUT, что означает, что объект не получил сигнал в течение указанного периода времени (поток не был выполнен);

WAIT_ABANDONED указывает, что у объекта есть сигнал, но он по-прежнему не может быть выполнен, обычно из-за того, что блокировка не была получена или по другим причинам.

Пример кода выглядит следующим образом:

// ConsoleApplication1.cpp: определяет точку входа консольного приложения.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <iostream>
using namespace std;

int i = 0;
DWORD WINAPI FunProc(LPVOID lpParameter);

DWORD WINAPI FunProc(LPVOID lpParameter)
{
for (; i < 10; i++)
{
if (!(i % 10))
cout << endl;
else
cout << i << endl;
}
return 0;
}

void main()
{
cout << i << endl;
HANDLE hThread;
hThread = CreateThread(NULL, 0, FunProc, NULL, 0, NULL);
DWORD dwRet = WaitForSingleObject(hThread, 1);
if (dwRet == WAIT_OBJECT_0)
{
cout<< "Конец выполнения созданного потока" << endl;
}
if (dwRet == WAIT_TIMEOUT)
{
cout<< "Тайм-аут ожидания" << endl;
}
if (dwRet == WAIT_ABANDONED)
{
cout<< "Abandoned" << endl;
}
CloseHandle(hThread);
system("pause");
return 0;
}

Результат:

В этом коде сначала определите переменную i как 0 в начале, а затем выведите ее в функции main, чтобы в первой строке результата было 0.

После этого мы запускаем поток, вводим функцию потока FunProc и выводим остаток от i ++ до 10 в FunProc до тех пор, пока i> 10 не завершит цикл и поток не завершится. В это время результатом, возвращаемым в WaitForSingleObject, будет WAIT_OBJECT_0, что означает, что поток завершается нормально, и результатом является Вывод.

Среди них эффект WaitForSingleObject эквивалентен уровню, и программа может продолжить выполнение только после того, как результат будет возвращен в WaitForSingleObject.

Это время ожидания исчерпания семафора после завершения потока. Мы также можем установить второй параметр WaitForSingleObject наINFINITE, Можно ждать вечно. Результат:

Исходный текст ссылки:WaitForSingleObject

Другие ссылки:Функция и использование WaitForSingleObject

  • Remove From My Forums
  • Question

  • Hi,

    I want to wait for an Event but also want to execute the Loop to see if the

    program is shutting down, here my code:

    while (g_bThreadRun ) { dwWaitResult = WaitForSingleObject(ghBlockAvailableEvent, 100); // INFINITE ); switch (dwWaitResult) { // Event object was signaled case WAIT_OBJECT_0: // // TODO: Read from the shared buffer // break; case WAIT_TIMEOUT: //6: // Just give the thread a chance to read the g_bThreadRun flag at regular time intervals // This way we have a chance to stop the thread during program shutdown break; // An error occurred default: int err = GetLastError(); return 0; }

    I found out, that a return code of 6 is generated, when the function runs into a timeout unfortunately the Symbol
    WAIT_TIMEOUT has a different
    value. Why?

    With best regards

    Gerhard


    Gerhard

    • Moved by

      Tuesday, July 19, 2016 5:52 AM
      Thread written in English

    • Moved by
      Xavier Xie-MSFT
      Wednesday, July 20, 2016 3:19 AM
      not uwp question


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

Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Wait for single object, Трабл со временем приема из com порта 

:(

   

Опции темы

KRTPC
Дата 3.8.2006, 10:09 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет

Люди я работаю с GSM модемом и не факт что он всегда ответит и по этому я использую Wait for single object. Я пишу в порт с помошью WriteFile сбрасываю событие ResetEvent  и жду приема Wait for single object. WaitComEvent неподходит так как модем может не ответить и прога зависнет. Как правильно дождаться приема и считать а по истечению таймера сказать что устройство вовремя не ответило
вот мой кусок как я пытаюсь сделать подскажите как исправить или дайте свой пример

Код

HANDEL portcomm;
OVERLAPPED              ovr={0};
ovr.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!WriteFile(portcomm,buf_out.c_str(),strlen(buf_out.c_str()),&bc,&ovr))
        {
                ShowMessage("Невозможно передать в порт");
        }
        /*
        ResetEvent(ovr.hEvent);
        event_com=WaitForSingleObject(ovr.hEvent,10000);
        switch (event_com)
        {
        case WAIT_ABANDONED:
        {
                GetOverlappedResult(port_ptr,&ovr,&bc,FALSE);
                ReadFile(port_ptr,buf_in,100,&bc,&ovr);
                Label1->Caption= buf_in;
        }
        break;
        case WAIT_TIMEOUT:
                ShowMessage("Устройство вовремя не ответило");
        break;
        case WAIT_FAILED:
                ShowMessage("ERROR");
        break;

зарание спасибо да и я не спец то если можно и немного поясните если можно но буду рад всему 

PM MAIL   Вверх
ElcnU
Дата 3.8.2006, 10:25 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 43
Регистрация: 28.4.2006

Репутация: нет
Всего: нет

в другом патоке и с помощью событий

PM MAIL   Вверх
KRTPC
Дата 3.8.2006, 10:48 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет

а как мне определить что порт свободен?

PM MAIL   Вверх
Romikgy
Дата 3.8.2006, 10:54 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146

если открыть его не удасться значит занят smile а вообще он ошибку выдаст что порт открыт

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
KRTPC
Дата 4.8.2006, 09:39 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет

нужна помошь smile

Код

HANDLE                  port;
OVERLAPPED           ovr={0};

port = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,            
 FILE_FLAG_OVERLAPPED, NULL);        

                                   WriteFile(port,buf_out.c_str(),strlen(buf_out.c_str()),&bc,&ovr);

на операцию WriteFile прога выдает ошибку 997 ERROR_NOACCESS 
при этом в порт пишется и из порта можно считать но не понятно откуда ошибка??? smile

PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 11:02 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146

Цитата(KRTPC @  4.8.2006,  08:39 Найти цитируемый пост)
port = CreateFile («COM1», GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,             FILE_FLAG_OVERLAPPED, NULL);  

после этого в переменой порт что?

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
KRTPC
Дата 4.8.2006, 12:38 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет

переменная pory HANDEL и CreateFile возврашает тоже HANDEL если не так то поясни по подробнее что ты хочешь спросить smile 

PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 12:51 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146

то что она возвращает я знаю, что в ней при трасировке?

Код

if (port == INVALID_HANDLE_VALUE) {
    dwError = GetLastError();

    /* handle error */
}

такую проверку сделай после криате файла

Код

Communications Resources

The CreateFile function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDistribution parameter must be OPEN_EXISTING, and the hTemplate parameter must be NULL. Read, write, or read-write access can be specified, and the handle can be opened for overlapped I/O. 

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
KRTPC
Дата 4.8.2006, 14:28 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.12.2005

Репутация: нет
Всего: нет

эту проверку я делаю и в ней ошибок нет.Ошибка появляется после writefile-код ошибки 997,
но в порт поишется и читается smile 

PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 15:17 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146

KRTPC, SetCommState
сначало имхо надо настроить порт для передачи

Добавлено @ 15:23 
http://vingrad.ru/CPP-FAQ-002452

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
Ataru
Дата 7.4.2009, 16:37 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.9.2008

Репутация: нет
Всего: нет

Цитата(KRTPC @ 4.8.2006,  09:39)
на операцию WriteFile прога выдает ошибку 997 ERROR_NOACCESS 
при этом в порт пишется и из порта можно считать но не понятно откуда ошибка???

вообще-то 997 это ERROR_IO_PENDING, а ERROR_NOACCESS = 998

PM MAIL   Вверх
maxim1000
Дата 7.4.2009, 17:27 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110

Цитата(KRTPC @  4.8.2006,  09:39 Найти цитируемый пост)
WriteFile(port,buf_out.c_str(),strlen(buf_out.c_str()),&bc,&ovr);

довольно опасная строка
std::string не гарантирует, что пока WriteFile будет писать, там ничего не поменяется или буфер вообще не переаллокейтится в другое место

———————

qqq

PM WWW   Вверх
GremlinProg
Дата 7.4.2009, 19:08 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106

ResetEvent тут точно стабильности не прибавит
сразу перед сбросом, операция может завершится и на тебе — дедлок на 10 сек и дальнейшая потеря управления над этим буфером
а GetOverlappedResult без ожидания — не дает гарантии, что ее вызов потребуется только единожды (тут цикл нужен, пока не будет передано требуемое число байт)

кстати, к чему тут WAIT_ABANDONED?

Цитата(WaitForSingleObject @ MSDN)
WAIT_ABANDONED
The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread, and the mutex is set to nonsignaled.

If the mutex was protecting persistent state information, you should check it for consistency.

GetOverlappedResult и т.п. ставь в ветку WAIT_TIMEOUT
а WAIT_ABANDONED убери

———————

«Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины.»

PM WWW ICQ   Вверх
Dem_max
Дата 7.4.2009, 19:17 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
***

Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39

А не вариант посмотреть двумя темами ниже и увидеть работающий код ??? что за лень такая ?
Обмен по COM порту

———————

Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют «Твой зайка написал» («Yоur bunnу wrоte»)

PM MAIL   Вверх
xvr
Дата 8.4.2009, 11:16 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 40
Всего: 223

Цитата(KRTPC @ 3.8.2006,  10:09)
Люди я работаю с GSM модемом и не факт что он всегда ответит и по этому я использую Wait for single object. Я пишу в порт с помошью WriteFile сбрасываю событие ResetEvent  и жду приема Wait for single object. 

Прием осуществляется функцией ReadFile, а ее в исходнике не наблюдается  smile 
Для отправки и последующего приема последовательность действий должна быть такой:

Код

ResetEvent()
WriteFile()
if (error && GetLastError()==ERROR_IO_PENDING) GetOverlappedResult(..,TRUE);
ResetEvent()
ReadFile()
if (!error) -> All Ok
if (GetLastError()!=ERROR_IO_PENDING) -> read error
WaitForSingleObject(..,timeout)
if (timeout hit) {CancelO(); -> error timeout}
else GetOverlappedResult(...,FALSE)
PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «C/C++: Системное программирование и WinAPI»

Fixin

GremlinProg

xvr

feodorv

  • Большое количество информации и примеров с использованием функций WinAPI
    можно найти в

    MSDN

  • Описание сообщений, уведомлений и примеров
    с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в

    MSDN Control Library

  • Непосредственно, перед созданием новой темы, проверьте заголовок
    и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля «Название темы», обратите внимание
    на наличие и содержание панели «А здесь смотрели?»,
    возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится
    проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code],
    или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей
    ссылкой, расположенной напротив названия темы.
  • Один топик — один вопрос!
  • Перед тем как создать тему —

    прочтите это
    .

На данный раздел распространяются

Правила форума

и

Правила раздела С++:Общие вопросы

.


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением,
Chipset,
Step,
Fixin,
GremlinProg,
xvr.
feodorv.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »

Плохая логика вообще. Например, есть следующие проблемы.

  • CreateEvent/CloseHandle не должны выполняться при каждом событии ReadFile/WaitCommEvent.
  • Использование GetCommMask/WaitCommEvent также неверно.
  • Размер прочитанных данных, указанный в ReadFile, является фиксированным независимо от ситуации.
  • Он также включает комментарий к @RbMm.

Вы можете изменить дизайн своей программы со ссылкой на следующие статьи и исходный код:

Синхронизация и перекрытие ввода и вывода

Последовательная связь

Бмо/мттти


Кроме того:
Я не заметил, что для WaitForSingleObject был указан дескриптор файла (а не дескриптор события), как указала @Rita Han.
Самая большая проблема в том.

Однако ситуация, что лучше сделать редизайн, не изменилась.
В источнике ответа @Rita Han нет описания WaitCommEvent и Overlapped для него. Кроме того, в ReadFile фиксируется размер прочитанных данных.


С другой стороны:
Хотя это не происходит в исходном коде вопроса, WaitCommEvent/WaitForSingleObject может генерировать событие, не указанное в SetCommMask.

  • Пока WaitCommEvent ожидает завершения, измените маску события с помощью SetCommMask.
    Примечания — функция WaitCommEvent

    If a process attempts to change the device handle’s event mask by using the SetCommMask function while an overlapped WaitCommEvent operation is in progress, WaitCommEvent returns immediately. The variable pointed to by the lpEvtMask parameter is set to zero.

  • Пока WaitCommEvent ожидает завершения, вызовите WaitCommEvent несколько раз, используя одну и ту же структуру Overlapped.
    Синхронизация и перекрытие ввода и вывода

    When performing multiple simultaneous overlapped operations on a single thread, the calling thread must specify an OVERLAPPED structure for each operation. Each OVERLAPPED structure must specify a handle to a different manual-reset event object.

    A thread should not reuse an event with the assumption that the event will be signaled only by that thread’s overlapped operation. An event is signaled on the same thread as the overlapped operation that is completing. Using the same event on multiple threads can lead to a race condition in which the event is signaled correctly for the thread whose operation completes first and prematurely for other threads using that event.

Документ описан выше, но в зависимости от драйвера/поставщика устройства, WaitCommEvent, который вызывается позже, заканчивается ошибкой, а WaitCommEvent, ожидающий завершения, — это lpEvtMask, возвращающий ноль (как в SetCommMask).


Для нескольких перекрывающихся структурных переменных:
Распространенным ноу-хау в программировании является то, что использование одной переменной для нескольких целей чревато ошибками.
Если вы проектируете в асинхронном и/или многопоточном режиме, лучше подготовить как минимум три структурные переменные Overlapped для ReadFile, WriteFile, WaitCommEvent.

О запуске ReadFile вне зависимости от состояния входного буфера:
Речь идет о вызове ReadFile с фиксированной длиной 256 байт без получения размера полученных данных во входном буфере драйвера устройства.

На самом деле, даже если придут все данные, если они меньше 256 байт, они всегда будут задерживаться до тех пор, пока не произойдет тайм-аут приема 256 байт.

Например, цикл считывает по одному байту за раз, пока не произойдет ошибка тайм-аута, что означает конец полученных данных (тайм-аут чтения 1 байта не повлияет).
Или, как было сказано в предыдущей статье, используйте ClearCommError, чтобы получить размер данных, хранящихся во входном буфере драйвера устройства, и вызовите ReadFile, указав этот размер.

Не будет проблем с обработкой буфера на стороне приложения, которую вы объясняете.

О поведении WaiCommEvent при вызове SetCommMask:
Это может зависеть от используемого драйвера устройства.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Wabco расшифровка кодов ошибок
  • Wabco smartboard сброс ошибок