crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Qt и callback функции Windows, Как это можно совместить?
ldimitri
  опции профиля:
сообщение 3.4.2009, 9:25
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 3.4.2009
Пользователь №: 657

Спасибо сказали: 0 раз(а)




Репутация:   0  


Суть вопроса состоит в следующем:
Пишется класс-оболочка для драйвера устройства, одна из функций этого драйвера устанавливает callback на события устройства. Как можно сделать так, чтобы внеклассовая функция знала, что в данный какой-либо конкретный момент времени ей нужно использовать методы определенного класса?(устройств может быть подключено одновременно несколько, на каждое пойдет свой собственный объект класса-оболочки).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2009, 9:57
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ldimitri @ 3.4.2009, 13:25) *
Как можно сделать так, чтобы внеклассовая функция знала, что в данный какой-либо конкретный момент времени ей нужно использовать методы определенного класса?
ну как сделать, чтобы функция ЗНАЛА, я думаю кроме тебя врядли кто-то знает, ведь ты же работаешь с устройством и должен знать его тип.
И из этого вопроса врятли можно сделать вывод, что речь и дёт о Qt.

П.С. может, конечно, я сути не понял. Тогда давай подробности.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 3.4.2009, 10:17
Сообщение #3


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


вот так:
void func()
{
obj->Process();
}

можно свичом дополнить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 3.4.2009, 11:03
Сообщение #4


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Цитата(kuler @ 3.4.2009, 11:17) *
вот так:
void func()
{
obj->Process();
}

можно свичом дополнить

Свитч на постоянно меняющееся количество процессов? О_о
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 3.4.2009, 13:38
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


ldimitri,
ничего не понятно может быть поэтому жутко интересно.
давайте подробности.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ldimitri
  опции профиля:
сообщение 3.4.2009, 14:29
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 3.4.2009
Пользователь №: 657

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть драйвер. Он поддерживает до восьми одновременно подключенных устройств. Есть возможнось работы по поллингу(уже реализована в Qt-классе) и по callback. в callback'e должно происходить чтение принятых данных в структуру(определенную в хедере драйвера).
Это делается примерно так:
void __stdcall cbFunction(u16 type)
{
    structure rs;
    int ret;
    
    ret = ReadData(num_device, &rs, 1);
    if (ret >= 0)
        //передать данные в экземпляр класса, ответственного за конкретный номер устройства (num_device)
    else
        //всякая обработка ошибок
}


Суть в том, что этой функции заранее неизвестны ассоциации номеров устройств и объектов, устанавливается она посредине инициализации устройства, и вот в "передаче данных в экземпляр класса, ответственного за конкретный номер устройства" и есть сама загвоздка.

До чего додумался с момента предыдущего поста:
1. Думал сделать а-ля COM - есть класс, ответственный за создание, удаление, управление объектами и связями "объект-номер устройства". При таком раскладе - на каждое устройство прописывать по одному callback'у да еще держать пачку глобальных переменных.
2. Другой вариант - анализ в самой callback-функции наличия ассоциированных объектов с конкретным номером устройства - при этом получается что функция слишком нагружается, а она должна быстро счтитать, отослать и - ret.

Жду других идей, критики(я ее особенно люблю - когда меня критикуют мне все жестче идеи в голову приходят;) ) и дополнений по этим двум вариантам.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 3.4.2009, 14:40
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(ldimitri @ 3.4.2009, 15:29) *
заранее неизвестны ассоциации номеров устройств и объектов,


может сделать контейнер указателей на объекты обработчики и по ключу(индексу) (ключ или индекс есть номер устройства) получать доступ к объекту или его callback`у.... заполнять контейнер можно в любое время по идее он опредлен как статический и по умолчанию в нем нули вместо указателй при доступе проверять на ноль.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 7.4.2009, 23:28
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


ну что как успехи с хитрой задачей?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ldimitri
  опции профиля:
сообщение 8.4.2009, 9:54
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 3.4.2009
Пользователь №: 657

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 8.4.2009, 0:28) *
ну что как успехи с хитрой задачей?


Решил особо не думать)) Зарегистрировал событие, оно устанавливается в callback'e. каждый экземпляр класса его отслеживает, и потом проверяет , ему ли это пришло. если ему - то и считывает, если нет - то поток снова уходит в WaitForSingleObject. Мне так показалось наиболее быстро и безболезненно, тем более что при таком образе действий становится возможным использовать тот же самый поток, что и в мониторинге по поллингу (с добавлением в него пары условных операторов). Вот.
Собственно, на данном этапе разработки, задача первичной оболочки драйвера решена и отлажена, а по мере появления непоняток и интересностей во время превращения данной штуковины в вид "Driver->QDeviceDriver->QDeviceManager->QDeviceClient" буду обращаться к коллективному разуму )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 9.12.2019, 16:30