Russian Qt Forum

Qt => Общие вопросы => Тема начата: Flake от Январь 19, 2009, 15:20



Название: Косяк с хипом при мультитреде.
Отправлено: Flake от Январь 19, 2009, 15:20
Здравствуйте.

Есть приложение которое читает xml, берёт нужные атрибуты(которые QString) и конвертирует их в std::string.
При этом Runtime Library - Multi-threaded.

Теперь в чем засада.
Если имеется один атрибут, кириллицей, то toStdString() отрабатывает нормально.
Но если же один атрибут кириллицей, а другой латиницей, то всё валится - какой-то косяк с хипом.

Вот кусок кода:
Код:
QString qqq;
qqq = QString::fromLocal8Bit("<configuration><reactions><parameter psevdonim=\"NONEACTION\" extraInfo=\"Отсуствие реакции\" /><parameter psevdonim=\"CALLABONENT\" extraInfo=\"Звонок абоненту\" /></reactions></configuration>");

domDocument.setContent(qqq, true, &errorStr, &errorLine, &errorColumn);

QDomElement root = domDocument.documentElement();

QDomElement sysMessElement = root.firstChildElement("reactions");
QDomNodeList sysMessParams = sysMessElement.elementsByTagName("parameter");
QDomElement parameter;
for (int p=0; p<sysMessParams.count(); p++)
{
parameter = sysMessParams.item(p).toElement();

QString asd;
asd = parameter.attribute("extraInfo").toLocal8Bit();
std::string qwe = asd.toStdString();
}

Как-то надо по другому конвертировать в std::string...


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Dendy от Январь 19, 2009, 15:26
openSUSE 11.1 x86_64, Qt 4.4.3. Не крешится.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Flake от Январь 19, 2009, 15:28
У меня Qt 4.4.0 winXP.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Dendy от Январь 19, 2009, 15:29
Ну вы поняли, да? Обновитесь.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Flake от Январь 19, 2009, 16:30
Всё равно та же ошибка. Валится в секции #ifdef WINHEAP, так что в сусе мож всё нормально быть, а в винде косяк.

Как ещё можно переконвертить QString в std::string?


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Dendy от Январь 19, 2009, 16:44
Собрал на WinXP Pro SP2 с помощью VCExpress 2008. Работает не крешится. Можете весь код программы выложить? И сказать какой компиллятор используете.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: pastor от Январь 19, 2009, 16:45
Всё равно та же ошибка. Валится в секции #ifdef WINHEAP, так что в сусе мож всё нормально быть, а в винде косяк.

А какой компилятор?


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Flake от Январь 19, 2009, 16:52
Который в студии 2008 team
Код:
#include <QtCore/QCoreApplication>
#include <QDomDocument>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QString errorStr;
int errorLine;
int errorColumn;

QDomDocument domDocument;

QString qqq;
qqq = "<configuration><reactions><parameter psevdonim=\"NONEACTION\" extraInfo=\"Отсуствие реакции\" /><parameter psevdonim=\"CALLABONENT\" extraInfo=\"Звонок абоненту\" /></reactions></configuration>";

domDocument.setContent(/*device*/qqq, true, &errorStr, &errorLine, &errorColumn);

QDomElement root = domDocument.documentElement();

QDomElement sysMessElement = root.firstChildElement("reactions");
QDomNodeList sysMessParams = sysMessElement.elementsByTagName("parameter");
QDomElement parameter;
for (int p=0; p<sysMessParams.count(); p++)
{
parameter = sysMessParams.item(p).toElement();

QString asd;
asd = parameter.attribute("extraInfo");
std::string qwe = asd.toStdString();



parameter.clear();
}

return a.exec();
}



Название: Re: Косяк с хипом при мультитреде.
Отправлено: Dendy от Январь 19, 2009, 17:01
Qt 4.4.3, WinXP SP2, VCExpress 2008, ваша программа не крешится.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: pastor от Январь 19, 2009, 17:09
2 Flake: Попробуйте обновиться до Qt 4.4.3


Проверил у себя, краша нет. Qt 4.4.3, WinXP SP2, VS2008 Pro


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Flake от Январь 19, 2009, 17:12
Я обновился, всё равно валится.
Ещё дома сегодня гляну, у меня там на чистой машине 4.4.3 версия.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: pastor от Январь 19, 2009, 17:18
Я обновился, всё равно валится.

Странно. А какая конфигурация Qt?


Вот на трекере нашел вот такой баг репорт (http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=183776). Незнаю, связана ли ваша проблема с ним.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Flake от Январь 19, 2009, 21:47
Дома то же самое  >:(
Конфигурация дефолтная, когда просто установщиком Qt ставится.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Dendy от Январь 19, 2009, 22:00
Так вы используете уже собранную Qt с сайта? Если да, то хочу вас огорчить, мешать разные рантайм библиотеки в C++ моветон. Соберите Qt сами тем же компилятором что собираете свою программу.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: pastor от Январь 19, 2009, 23:00
Так вы используете уже собранную Qt с сайта? Если да, то хочу вас огорчить, мешать разные рантайм библиотеки в C++ моветон. Соберите Qt сами тем же компилятором что собираете свою программу.

+1


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Flake от Январь 20, 2009, 22:55
Пересобрал Qt. Запустил Visual Studio 2008 Command Prompt, потом configure и nmake. Глюк не ушёл, я в панике  ???

~
В общем спасибо за помощь. Я решил вопрос путем не использования toStdString(). А сделал как написано в ассистенсе - сначала ковертить в cons char * и потом в std::string.


Название: Re: Косяк с хипом при мультитреде.
Отправлено: Dendy от Январь 20, 2009, 23:58
Крайне странно. У меня ощущение, что вы всё же ошиблись в процессе сборки Qt или своей программы. Сделайте всё с чистого листа. Удалите Qt и стяните только исходники с сайта в zip-архиве. Соберите с помощью:

configure
nmake

Вычистите все обьектные файлы из своей программы и соберите её с нуля этим же компилятором, используя только что собраную версию Qt.