| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Работа функции |
| Автор: Acer 4.12.2008, 22:04 | ||||||||
| Есть метод класса. Его работа заключается в выборке данных из базы и записи этих данных в определенное поле класса. Вот код, который работает:
А вот код, который не работает:
Подскажите, в чем проблема? Почему при добавлении 2-х строк кода в выше приведенную функцию вот эта
возвращает -1 ? --------------------------------------------------------------
|
| Автор: J0ker 4.12.2008, 22:30 |
| такое может быть только в одном случае - если во втором случае перед этим вызывался любой код, который изменил состояние rdbc приведенный вами код никакой информации не несет - из него лишь можно сделать предположение, что перед вызовом RModuleCore::updateData() был еще один вызов RModuleCore::updateData(), который в else изменил состояние rdbc, и последующий вызов привел к ошибке. |
| Автор: Acer 4.12.2008, 23:06 | ||||||||||||||||||||||||||||
| хм... вроде нигде не должно меняться состояние обьекта rdbc... Ну вот, смотрите: начну с main:
тут из конфиг файла беру данные о модулях и создаю обьекты для каждого модуля. Затем они добавляются в ws (workspace) Далее после инициализации модулей они живут сами по себе. А именно: в конструкторе класса RModule:
Это Qt. По истечению времени таймера запускается метод класса RModule - updateData() RModule::updateData()
RModuleCore::isConnected()
RODBC::isConnected()
mod_core - это свойство обьекта класса RModule и является экземпляром класса RModuleCore. RModuleCore для каждого модуля запускается в отдельном потоке. При выполнении mod_core->start(); запускается метод run: RModuleCore::run()
После завершения работы метода this->updateData() в классе RModuleCore генерируется сигнал, который оповещает RModule о том, что нужно запустить updateDisplay(); RModuleCore::updateData()
RModule::updateDisplay()
В методе RModule::updateDisplay() берутся данные, которые RModuleCore достал из базы: RModuleCore::getDataAtm()
Данные представляют собой вектор структур(мало полей, так как программа в стадии разработки):
Далее, что касается класса, работающего с базой: RODBC::execQuery
RODBC::exec
RODBC::getRowsCount
RODBC::getCellValue
|
| Автор: J0ker 4.12.2008, 23:16 |
| ээээ давайте вы просто дебагером пройдетесь и посмотрите все обращения к rdbc, а заодно и сверитесь с документацией по библиотеке, предоставляющий этот объект |
| Автор: Acer 4.12.2008, 23:22 |
| Я сам писал эту библиотеку |
| Автор: J0ker 4.12.2008, 23:35 |
| тем более |
| Автор: Acer 4.12.2008, 23:48 |
| Еще один интересный факт: Первый запрос проходит нормально, а второй уже возвращает -1 |
| Автор: J0ker 5.12.2008, 00:34 |
| это я и имел ввиду у вас объект вероятно не детерминирован |
| Автор: Acer 5.12.2008, 20:52 |
| Вобщем, проблема в том, что я еще не совсем понимаю многопоточную обработку данных.... Я заменил библиотеку для работы с базами. Но непонятно вот-что: при старте программы все модули коннектятся к базе. Но потом соединение остается только у последнего. Все, кто грузился ранее, теряют связь с базой :( |