Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Zusykss от Июнь 17, 2017, 17:14



Название: Подскажите, в чем может быть проблема
Отправлено: Zusykss от Июнь 17, 2017, 17:14
Хочу запустить функцию в отдельном потоке.
Он доходит до вызова функции ReadOption()
Там заходит в цыкл, и на первом case 0:
Вылетает ошибка (:-1: ошибка: Debugger encountered an exception: Exception at 0x7ffd0d16afec, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance))
Подскажите может не правильно потоки делаю, потому что без потока, если просто запустить все работает без проблем.
Код:

void Presenter::run()
{
    m_kino.reset(new ParserKino);
    m_kino->SetOption(m_option);
    QObject::connect(m_kino.get(), &ParserKino::SignalStatus, m_windoww, &WindowParser::LoadSlot, Qt::DirectConnection);
    QObject::connect(m_kino.get(), &ParserKino::StatisticReady, m_windoww, &WindowParser::WriteStatistic, Qt::DirectConnection);
    QObject::connect(m_kino.get(), &ParserKino::setopti,this, &Presenter::SetOpt, Qt::DirectConnection);
    m_kino->RunThread();
}

void ParserKino::RunThread()
{
    QtConcurrent::run(this, &ParserKino::StartParsing);
}

void ParserKino::StartParsing()
{
    ReadOption();
    QString statistic = ReadFile(PATH_STATISTIC);
    SetLink(m_option->m_link);
    int period = m_option->m_periodDo - m_option->m_periodOt;
    if(m_option->m_periodDo == m_option->m_periodOt)
        period = 1;
    else
        period +=1;

    if(!m_option->m_neObnovlat)
    {
        Updating();
        AfterUpdating();
    }


void ParserKino::ReadOption()
{
    QString strBuff = ReadFile(PATH_OPTION);
    QStringList list = strBuff.split(",");
    QString time;
    for(int i = 0; i < list.length(); i++)
    {

        strBuff = list.at(i);
        switch (i)
        {
            case 0: m_option->m_link = strBuff; break;
            case 1: m_option->m_maxIdInLink = strBuff.toInt(); break;
            case 2: m_option->m_maxColContent = strBuff.toInt(); break;
            case 3: m_option->m_periodOt = strBuff.toInt(); break;
            case 4: m_option->m_periodDo = strBuff.toInt(); break;
            case 5: m_option->m_neObnovlat = strBuff.toInt(); break;
            case 6: m_option->m_perezapisDanih = strBuff.toInt(); break;
            case 7: m_option->m_pervichnoeDobavlenie = strBuff.toInt(); break;
            case 8: m_option->m_typeContent = strBuff.toStdString().c_str(); break;
            case 9: time = strBuff; break;
            default:
                break;
        }
    }



Название: Re: Подскажите, в чем может быть проблема
Отправлено: gil9red от Июнь 17, 2017, 18:49
Попробуйте точнее определить на какой строке исключение, добавьте, например вывод в консоль, через qDebug() << 1;

Кст, в ReadOption реализация с for и switch лишняя, с тем же успехом, но с меньшим количеством кода можно было вписать:

Код
C++ (Qt)
m_option->m_link = list[0];
m_option->m_maxIdInLink = list[1].toInt();
m_option->m_maxColContent = list[2].toInt();


Название: Re: Подскажите, в чем может быть проблема
Отправлено: Zusykss от Июнь 17, 2017, 19:46
Я на дебагере смотрю, так кажется что он не инициализирован, хотя проверяю указатели, теже ...
пишет ошибку.
По смыслу ошибка, что обращаюсь к памяти которой нету. А чего так?
Объект создаю в uniqe_ptr


Invalid address specified to RtlValidateHeap( 0000019855C50000, 0000000071462E40 )
Debug Assertion Failed!

Program: ...er-Desktop_Qt_5_9_0_MSVC2017_64bit-Debug\debug\KinoParser.exe
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 904

Expression: _CrtIsValidHeapPointer(block)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
Debug Assertion Failed!

Program: ...er-Desktop_Qt_5_9_0_MSVC2017_64bit-Debug\debug\KinoParser.exe
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 908

Expression: is_block_type_valid(header->_block_use)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
Debug Error!

Program: ...er-Desktop_Qt_5_9_0_MSVC2017_64bit-Debug\debug\KinoParser.exe

HEAP CORRUPTION DETECTED: before Free block (#0) at 0x0000000071462E70.
CRT detected that the application wrote to memory before start of heap buffer.


(Press Retry to debug the application)
Отладка завершена

Отладка запущена
ParserKino(0x1acae334b30)
ParserKino(0x1acae334b30)
HEAP[KinoParser.exe]: Invalid address specified to RtlValidateHeap( 000001ACAAE10000, 0000000071462D38 )
Debug Assertion Failed!

Program: ...er-Desktop_Qt_5_9_0_MSVC2017_64bit-Debug\debug\KinoParser.exe
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 904

Expression: _CrtIsValidHeapPointer(block)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
Debug Assertion Failed!

Program: ...er-Desktop_Qt_5_9_0_MSVC2017_64bit-Debug\debug\KinoParser.exe
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 908

Expression: is_block_type_valid(header->_block_use)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
Отладка завершена

Отладка запущена
ParserKino(0x1e4b39c4f00)
ParserKino(0x1e4b39c4f00)
ASSERT: "i >= 0" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qstring.h, line 1112
Debug Error!

Program: C:\Qt\5.9\msvc2017_64\bin\Qt5Cored.dll
Module: 5.9.0
File: global\qglobal.cpp
Line: 3044

ASSERT: "i >= 0" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qstring.h, line 1112

(Press Retry to debug the application)
Debug Error!

Program: ...er-Desktop_Qt_5_9_0_MSVC2017_64bit-Debug\debug\KinoParser.exe

abort() has been called

(Press Retry to debug the application)


Название: Re: Подскажите, в чем может быть проблема
Отправлено: Zusykss от Июнь 17, 2017, 19:47
Про колличество кода, спасибо)) Буду теперь короче писать)


Название: Re: Подскажите, в чем может быть проблема
Отправлено: Zusykss от Июнь 17, 2017, 20:40
В общем.
Передаю в эту функцию строку, а в функции мне пишет, что строка не доступна, а все остальные поля заполнены мусором, хотя объект создавал и все обнулял, из-за чего такое поведение, объесните кто сталкивался с такой проблеймо.


Код:

void ParserKino::StartParsing()
{
    ReadOption();
    QString statistic = ReadFile(PATH_STATISTIC);
    SetLink(m_option->m_link);

// Ошибка вылетает на строке if()
void ParserKino::SetLink(const QString & link)
{

    m_link = link;
    m_host = link;
    if(m_link[m_link.length() - 1] == "/")



Название: Re: Подскажите, в чем может быть проблема
Отправлено: Zusykss от Июнь 18, 2017, 14:34
Проблема решена)


Название: Re: Подскажите, в чем может быть проблема
Отправлено: gil9red от Июнь 18, 2017, 17:03
Молодец, что разобрались :) В чем была причина ошибки?


Название: Re: Подскажите, в чем может быть проблема
Отправлено: Zusykss от Июнь 19, 2017, 09:10
Создал указатель на структуру, в одном месте он обнулялся....(
А так все было ок))