Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Mr.Woland от Июль 27, 2011, 21:54



Название: Проблемы при работе в потоке., disphelper,WMI,QThread
Отправлено: Mr.Woland от Июль 27, 2011, 21:54
Есть поток, в функции run которого используется функционал disphelper (http://"http://disphelper.sourceforge.net/")'а.
Данный функционал реализует запрос к 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 (http://"http://www.google.ru/search?client=opera&rls=ru&q=qt+runtime+error&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest#sclient=psy&hl=ru&newwindow=1&client=opera&rls=ru&channel=suggest&source=hp&q=+Error+Code:+++++800401e4&aq=f&aqi=&aql=&oq=&pbx=1&bav=on.2,or.r_gc.r_pw.&fp=6ba3d2abaccd40a9&biw=1600&bih=769")
Source:   Application"
Но ещё раньше программа вываливалась с сообщением о Runtime error'е.
А ещё раньше (и сейчас) в другом приложении данный код (в паре десятков потоков) работает прекрассно и без нареканий.
также в данном классе в конструкторе происходит доступ к инструментарию WMI без всяких проблем.
Коб вне потока работает.
В чем проблема ?
Переменные среды, настройки про файлов (за исключением списка файлов) идентичны для рабочего и нерабочего приложения.
ЗЫ.
Помогите плиз.
2 дня сношусь....


Название: Re: Проблемы при работе в потоке., disphelper,WMI,QThread
Отправлено: LisandreL от Июль 27, 2011, 22:48
Вы уверены, что код точно такой же?
Ругается оно на синтекcис запроса, что говорит об одном из двух:
а) ошибка в запросе
б) класс winmgmts не зарегистрирован на компьютере, на котором вы пытаетесь выполнить код.


Название: Re: Проблемы при работе в потоке., disphelper,WMI,QThread
Отправлено: Mr.Woland от Июль 27, 2011, 23:13
Вы уверены, что код точно такой же?
100%.
тот-же класс прекрассно работает в другом приложении.
далее, перед активацией потока, аналогичный запрос вызывается пару раз и все нормально.
при вынесении  кода из run он начинает прекрассно работать.....


Название: Re: Проблемы при работе в потоке., disphelper,WMI,QThread
Отправлено: LisandreL от Июль 27, 2011, 23:23
1) В run ошибка возникает всегда или только иногда (а есть и удачные запуски)?
2) wmiSvc где объявлено?
3) Поток такой только 1 работает или несколько? (в программе, где есть ошибки)


Название: Re: Проблемы при работе в потоке., disphelper,WMI,QThread
Отправлено: Mr.Woland от Июль 27, 2011, 23:31
1) В run ошибка возникает всегда или только иногда (а есть и удачные запуски)?
всегда.
но первоначально вылетало к чертям с runtime error.
2) wmiSvc где объявлено?
член класса.
3) Поток такой только 1 работает или несколько? (в программе, где есть ошибки)
работает несколько потоков.
штук 5-6. все вылетают с ошибкой.


Название: Re: Проблемы при работе в потоке., disphelper,WMI,QThread
Отправлено: LisandreL от Июль 28, 2011, 00:10
Скажу сразу - готового ответа у меня нет.

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

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



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


Название: Re: Проблемы при работе в потоке., disphelper,WMI,QThread
Отправлено: LisandreL от Июль 28, 2011, 18:46
Да. Магия и косяк в Qt при работе с потоками.
QWebView тащит за собой пару  мингв длл...
Интересно, в самом Qt проблема или в MinGW. VS не пробовали собирать?