Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CAsyncSocket и потоки, запутался, кто кого вызывает. 
:(
    Опции темы
Dreamer_0x01
Дата 20.12.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



В классе CAsyncSocket есть переопределяемые функции типа OnAccept, OnReceive и т.д., в которых можно выполнять какие-то свои действия.
А кто их вызывает? Я имею в виду, какой поток вызывает сами эти функции?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 20.12.2005, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Цитата(Dreamer_0x01 @ 20.12.2005, 14:54)
А кто их вызывает? Я имею в виду, какой
поток вызывает сами эти функции?


Переопредели у себя в классе A (class A : public CAsyncSocket) OnAccept, OnReceive, поставь бряк, а потом уже на нем просмтори стек вызовов




--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 20.12.2005, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



А однозначного ответа на это нет что ли, зависит от ситуации?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 20.12.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Так это же (стек вызовов) самое простое решение.
Добавлено @ 16:53
Debug->Windows->Call Stack


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 20.12.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Ясно, щас займемся.
Просто до дебага я еще не скомпилировал ;)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 20.12.2005, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Dreamer_0x01
А зачем такие подробности, если не секрет?
Что надо вообщем-то?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 21.12.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



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

и в этом отдельном потоке нужно ожидать приема данных сокетом.
(Принцип простой - я запросил у внешнего устройства пакет данных и должен дождаться его получения).
Фот собственно с ожиданием и возникли проблемы - как быть?
В месте, где нужно ждать приема данных, так и просится создать цыкл какой-либо переменной, с заходом/выходом в критическую секцию, значение которой выставить по переопределяемой функции OnReceive класса сокета.
Вот и думаю - будет работать или нет? Ведь если сокет создает свой поток при инициализации, то все будет нормально. А если эти вункции вызываются тем потоком, в котором создан экземпляр сокета - то мой цикл попросту заснет...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Romikgy
Дата 21.12.2005, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Имхо ф-ция
Цитата(Dreamer_0x01 @ 21.12.2005, 13:43)
OnReceive
вызовится только тогда , когда прийдут данные на сокет, зачем здесь поток? Тем более что сокет асинхронный!!!



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

PM   Вверх
Dreamer_0x01
Дата 21.12.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Функция вызывается не святым духом, а каким-то потоком. Каким? Моим, или каким-то другим, порожденным сокетом? Или оконным? Или главным потоком программы?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Romikgy
Дата 21.12.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Имхо в стеке будет адресс твоего потока , но инициатором будет система


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

PM   Вверх
Dreamer_0x01
Дата 21.12.2005, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Так, посмотрел в дебаггере, кто вызывает эту функцию, написано, что WinMain. Это чей поток?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Romikgy
Дата 21.12.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



smile Твой


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

PM   Вверх
JoyEx
Дата 21.12.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

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



Romikgy прав.

Winsock (Ws2_32.dll) через ntdll.dll (NtDeviceIoControlFile, NtReadFile, NtWriteFile, NtCreateFile) обращается в kernel к девайсу \Device\AFD, которое отправляет TDI IRP-пакеты драйверам протокола, затем уже NDIS IRP-пакеты попадают в NDIS и через минипорт NDIS в драйвер сетевой карты, и потом в сеть. Если у тебя асинхронный сокет, то IRP пакет просто отмечается как отложенный (PENDING) и к тебе возвращается управление, а когда этот пакет "завершится" в kernel, он будет поставлен в очередь APC твоего потока и вот, когда твой поток получит управление (квант) он тебе и даст знать об OnReceive.


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Coocky
Дата 22.12.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Dreamer_0x01
что-то запарился ты с сокетами.
Давай сюда проблему твою, сейчас решим smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 22.12.2005, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Да собственно что нужно.

Нужно, чтобы в программе были функции, работающие одинаково и с сокетами, и с ком-портом.

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

1.В моем потоке команда типа Write отправляет информацию в сокет (это просто).
2.Мой прибор, работающий в режиме сервера, отвечает на этот запрос.(это сделано на отдельном контроллере).
3.В моем потоке команда типа Read ждет этого ответа прибора в течении какого-то времени. (У меня для этого используется таймаут ком-портов.)

Все это работает в своем, специально выделенном для этого потоке.

То есть мне самое сложное - грамотно дождаться ответа сокета в команде Read, так же, как это делается и для ком-порта. Пока что получается, но я бы сказал мягко говоря безграмотно - я наплодил кучу пользовательских сообщений, и вынес сокеты в отдельный поток, работает, но чувствую, что я с каждым днем перестаю понимать свой код =)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.