Russian Qt Forum
Ноябрь 23, 2024, 03:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы при работе в потоке., disphelper,WMI,QThread  (Прочитано 4763 раз)
Mr.Woland
Гость
« : Июль 27, 2011, 21:54 »

Есть поток, в функции run которого используется функционал disphelper'а.
Данный функционал реализует запрос к WMI с целью мониторинга системных событий:
Код:
    try
    {
        const wchar_t*  Query=(const wchar_t *)this->TriggerRequest.utf16();
        dhCheck( dhGetObject(L"winmgmts:{impersonationLevel=impersonate,(Security)}!\\\\.\\root\\cimv2",NULL, &wmiSvc) );
        dhCheck( dhGetValue(L"%o", &wmiEventSrc, wmiSvc, L".ExecNotificationQuery(%S)",Query) );
        emit this->TriggerState(this->TriggerName,1);
        while (TRUE)
        {
            CDispPtr wmiLatestEvent;
            dhCheck( dhGetValue(L"%o", &wmiLatestEvent, wmiEventSrc, L".NextEvent") );
            emit this->Triggered(this->TriggerName,this->GenerateTriggerMsg(wmiLatestEvent),this->TriggerIcon);
            wmiLatestEvent.Dispose();
        }
    }
    catch (string errstr)
    {
        ErrorMSG=this->GenerateErrorMSG(QString::fromStdString(errstr));
        emit this->TriggerState(this->TriggerName,-1);
    }
проблема в следующем.
на  строчке
Код:
dhCheck( dhGetObject(L"winmgmts:{impersonationLevel=impersonate,(Security)}!\\\\.\\root\\cimv2",NULL, &wmiSvc) );
происходит сбой с сообщением:
Цитировать
   Member:   
Function: GetObject
Error In: GetObjectEx
Error:    Neioaene?aneay ioeaea
Code:     800401e4
Source:   Application"
Но ещё раньше программа вываливалась с сообщением о Runtime error'е.
А ещё раньше (и сейчас) в другом приложении данный код (в паре десятков потоков) работает прекрассно и без нареканий.
также в данном классе в конструкторе происходит доступ к инструментарию WMI без всяких проблем.
Коб вне потока работает.
В чем проблема ?
Переменные среды, настройки про файлов (за исключением списка файлов) идентичны для рабочего и нерабочего приложения.
ЗЫ.
Помогите плиз.
2 дня сношусь....
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июль 27, 2011, 22:48 »

Вы уверены, что код точно такой же?
Ругается оно на синтекcис запроса, что говорит об одном из двух:
а) ошибка в запросе
б) класс winmgmts не зарегистрирован на компьютере, на котором вы пытаетесь выполнить код.
Записан
Mr.Woland
Гость
« Ответ #2 : Июль 27, 2011, 23:13 »

Вы уверены, что код точно такой же?
100%.
тот-же класс прекрассно работает в другом приложении.
далее, перед активацией потока, аналогичный запрос вызывается пару раз и все нормально.
при вынесении  кода из run он начинает прекрассно работать.....
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июль 27, 2011, 23:23 »

1) В run ошибка возникает всегда или только иногда (а есть и удачные запуски)?
2) wmiSvc где объявлено?
3) Поток такой только 1 работает или несколько? (в программе, где есть ошибки)
Записан
Mr.Woland
Гость
« Ответ #4 : Июль 27, 2011, 23:31 »

1) В run ошибка возникает всегда или только иногда (а есть и удачные запуски)?
всегда.
но первоначально вылетало к чертям с runtime error.
2) wmiSvc где объявлено?
член класса.
3) Поток такой только 1 работает или несколько? (в программе, где есть ошибки)
работает несколько потоков.
штук 5-6. все вылетают с ошибкой.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июль 28, 2011, 00:10 »

Скажу сразу - готового ответа у меня нет.

Предложу такой план тестирования:
1) Ограничить число потоков QThread до 1.
2) Если ошибка не исчезла, то убрать из главного потока вызовы disphelper'а.
3) Если ошибка всё ещё сохраняется - заменить вызов start() на run(), что бы быть точно уверенным, что точно такой же код в основном потоке ошибок не вызывает.

Есть, конечно, ещё вариант отказаться от disphelper'а в пользу QAxObject и иже с ним, но нет уверенности что проблема тут именно в disphelper'е, тем более вы говорите, что в другом приложении нечто такое работает, причём многопоточно.

Записан
Mr.Woland
Гость
« Ответ #6 : Июль 28, 2011, 18:30 »

Скажу сразу - готового ответа у меня нет.
Предложу такой план тестирования:
1) Ограничить число потоков QThread до 1.
2) Если ошибка не исчезла, то убрать из главного потока вызовы disphelper'а.
3) Если ошибка всё ещё сохраняется - заменить вызов start() на run(), что бы быть точно уверенным, что точно такой же код в основном потоке ошибок не вызывает.
Проблема решилась.
Решение проблемы: Добавить QWebView к форме из которой создается список потоков.
Да. Магия и косяк в Qt при работе с потоками.
QWebView тащит за собой пару  мингв длл......
Цитировать
Есть, конечно, ещё вариант отказаться от disphelper'а в пользу QAxObject и иже с ним, но нет уверенности что проблема тут именно в disphelper'е, тем более вы говорите, что в другом приложении нечто такое работает, причём многопоточно.
Пробовал ActiveQt/
Но он слишком медленный. Некоторые операции с QAxObject в 10-20 раз медленнее чем черз disphelper.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Июль 28, 2011, 18:46 »

Да. Магия и косяк в Qt при работе с потоками.
QWebView тащит за собой пару  мингв длл...
Интересно, в самом Qt проблема или в MinGW. VS не пробовали собирать?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.