Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Это гавно меня уже достало.  (Прочитано 10695 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« : 19-12-2005 11:02 » 

Есть программка которая работает асинхронно с СОМ портом.

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

При чтении с помощью синхронизационного события передается сообщение о прочтении очередной порции данных и все данные передаются в главный поток.

В момент времени С когда главный поток решает записать в порт что-либо, делается следующее.
Запускается событие (Эвент) который сообщает ждущему на чтении потоку, что ему надо бы уйти в суспенд освободив очередь...

Т.е. код запроса на чтение выглядит так:

Код:
SetEvent(pMain->GetWriteEvent());
WaitForSingleObject(pMain->GetSinchronizeEvent(), INFINITE);
ResetEvent(pMain->GetSinchronizeEvent());

Т.е. изначально посылается сообщение о требовании записи в порт, после чего поток садиться на ожидание синхронизационного события, которое сообщит об успешном освобождении потоком чтения ресурса.
Вот код потока чтения в момент прихода эвента о требовании на запись:

Код:
if (resWait == WAIT_OBJECT_0+1)
{
ResetEvent(arrHandles[1]);
if (!param->type)
{
CancelIo(hcPort);
SetEvent(pMain->GetSinchronizeEvent());
SuspendThread(pMain->mSerial.GetMasterThread());
}

}

Т.е. поток ресетит событие о требовании на запись для слеующего раза.
Все опреации стоящии в PENDING режиме удаляет.
Выставляет синхронизационный эвент для продолжения работы на запись.
Сам уходит в суспенд, дабы не мешать процессу записи в порт.

Что происходит далее.
Далее просыпается главный поток получив сообщение синхронизации.
Он активизирует запись в файл так:

Код:
hMaster = pMain->mSerial.GetHandle(pMain->mSerial.GetSerialMasterPort());
masterOv = pMain->mSerial.GetOverlapped(pMain->mSerial.GetSerialMasterPort());

if (!WriteFile(hMaster, cmdLine,strlen(cmdLine),&read,masterOv))
{
err = GetLastError();
if (err != ERROR_IO_PENDING)
{
SendMessage(pMain->m_hWnd,WM_ERROR_THREAD_EXIT,0,0);
param->st = (STATES)0;
break;
}
}

resWait = WaitForSingleObject(masterOv->hEvent, INFINITE);
if (resWait != WAIT_OBJECT_0)
{
SendMessage(pMain->m_hWnd,WM_ERROR_THREAD_EXIT,0,0);
param->st = (STATES)0;
break;
}

//GetQueuedCompletionStatus(hMaster,&read,&key,&masterOv,INFINITE);


ResetEvent(masterOv->hEvent);
if (!WriteFile(hMaster, "\r\n",2,&read,masterOv) )
{
if (err != ERROR_IO_PENDING)
{
SendMessage(pMain->m_hWnd,WM_ERROR_THREAD_EXIT,0,0);
param->st = (STATES)0;
break;
}
}
resWait = WaitForSingleObject(masterOv->hEvent, INFINITE);
if (resWait != WAIT_OBJECT_0)
{
SendMessage(pMain->m_hWnd,WM_ERROR_THREAD_EXIT,0,0);
param->st = (STATES)0;
break;
}



ResetEvent(masterOv->hEvent);
ResumeThread(pMain->mSerial.GetMasterThread());

Т.е. считываются необходимые HANDLE'S, стартует асинхронная запись в порт, после чего на событие в оверлаппед струкутуре ставится ожидание.
По идее после отработки всего действа после прихода сообщения об окончании записи в порт, у меня поток получит событие о окончании статуса PENDING запись продолжится до момента полной передачи команды в порт, после чего поток перейдет к следующей команде предварительно оживив поток чтения с помощью ResumeThread. Однако хуюшки вашей дунюшке.


Никакого результата не получаем до тех пор, пока эта ужас не отработает чтение с порта. Т.е. ни очередь не чистится ничерта.
При этом запись в порт с потока чтения вполне активна и проходит нормально.


Это уже сутки тупости подобной, сил моих больше нет смотреть на убогость майкрософта создать нечто асинхронное.
Но задачку надо решить.
Что я делаю не так? Чего еще эта манда хочет от программы, дабы осуществить посылку отложенной операции???
« Последнее редактирование: 19-12-2007 18:24 от Алексей1153++ » Записан

А птичку нашу прошу не обижать!!!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 19-12-2005 11:36 » 

ГРОМ, для начала успокойся Улыбаюсь

Не пробовал поюзать критические секции?

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 19-12-2005 11:40 » 

кстати, какую проблему вызывает у тебя одновременная запись и чтение в порт?

Можешь описать задачу не так эмоционально и не так длинно? А то я так с перепугу не въеду в суть
Записан

Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 19-12-2005 11:59 » 

Леш - причем тут критикал секшн?Не понял Это объект синхронизации. При асинхронном режиме есть свое события для синхронизации в оверлаппед структуре.
Записан

А птичку нашу прошу не обижать!!!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 19-12-2005 12:12 » 

При асинхронном режиме есть свое события для синхронизации в оверлаппед структуре.

которые не работают ? Улыбаюсь)
Записан

Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 19-12-2005 12:45 » 

Уже все заработало.... Улыбаюсь Не тот хендл брал под суспенд.
Записан

А птичку нашу прошу не обижать!!!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 19-12-2005 13:00 » 

круто Улыбаюсь
сколько километров нервов? Улыбаюсь
Записан

Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 19-12-2005 14:18 » 

А хрен его знает - не измерял.
Я двое суток сидел над тем фактом, что асинхронный режим работы с портом имеет ОДНУ!!!! очередь на чтение и на запись.
И что если поставлено ожидания прихода символа, то запись в порт не пройдет пока это ожидание не случиться.
Т.е. представить себе я не мог, что асинхронный режим не имеет возможности одновременной записи и чтения. Все равно только по очереди.
Вся асинхронность этого говна, только в возможности записывать и считывать не блокируя поток. Но суть в том, что для организации такой же работы с портом хватило бы обычного синхронного режима и ОДНОЙ функции - которая выбивала бы из ожидания или из блокированного чтения по ошибке и ничего больше не надо....

В общем - после этого к мелкомягким моя любовь выросла на порядок....!!!
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines